A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 铿锵科技 于 2013-8-10 23:22 编辑

有一个1001个元素的数组a[n],每个元素都在1到1000这些整数中取值,其

中只有一个数得复,并且数组中每个元素只能被访问一次,设计一个算法找

出这个数字.说明:每个元素只能被访问一次,就像执行int v=a[1],v变量

和a[1]元素不能再访问.求高手指教

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

10 个回复

正序浏览
容量为1001的数组,每个位置中的数都是1——1000范围内的,只有一对是重复的,那么肯定是1——1000中每个数字都出现了一次,只有一个出现了两次,那么你对这个数组进行求和就行了int sum = 0,x=0;
                   for(int i:arr)
                   {
                        sum +=i;
                     }
                  循环结束后用sum减去1加到1000的和就是那个重复的数了
回复 使用道具 举报
谢了楼上的多位辛苦了!
回复 使用道具 举报
不可能实现吧?按照你的意思,就是一访问到这个数就知道他是不是那个重复的数了。通过比较或者转成集合,都不止访问一次。除非是通过数学的算法。那这样又不是程序的算法了。
数学的算法可以用1001个元素的和减去1到1000的和就是这个数。这个必须是有两个先决条件:1001个元素的值是从1到1000取的。而且只有一个数重复。
如果换成程序,那么可以这么来:
  1. int sum = 0;
  2. int sumA = 0;
  3. int num;
  4. for(int i=1;i<=1000;i++)
  5. {
  6.         sum += i;
  7. }

  8. for(int i = 0;i<a.length;i++)
  9. {
  10.         sumA += a[i];
  11. }
  12. num = sumA - sum;
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
public static void main(String[] args) {
                int[] arr=new int[1001];//定义一个能够存储1001个元素的数组。
                int sum=0;//定义一个变量用于存储arr数组元素里面的所有总和。
                int sum1=0;//定义一个变量用于存储1-1000的总和。
                for(int i=0;i<arr.length;i++){
                        sum+=arr[i];//用for循环,遍历求出集合中所有元素的总和。
                }
                for(int i=0;i<1001;i++){
                        sum1+=arr[i];//用for循环,遍历求出1-1000中所有元素的总和。
                }
                int a=sum-sum1;//假设a为,arr数组里面重复的元素!
                System.out.println("数组里面重复的数字为:"+a);

        }

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
数组==>ArrayList==>HashSet==>ArrayList.removeAll(HashSet)===>得到那个重复的数字
这样行不行?
回复 使用道具 举报
本帖最后由 单凯 于 2013-8-8 10:46 编辑

一共有1001个数,其中1000个数是从1到1000取值的(而且取完一遍),另外一个数是重复数,
那就用这1001个数的和,与前头那个1000数的等差数列相减,便得出那个重复数了.

for (int num=0,i=0;i<1001;i++)  

num+=a【i】-i;
i从0开始,所以减的是1到1000的和。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
只要找出这个数啊- -  昏。那我倒是有思路了。
对这个数组用角标的方式求和得num,
又因为1-1000个数肯定都出现一遍,
所以直接用num-(1+1000)*500就行了,
求得的就是重复的数。
回复 使用道具 举报
不好意思打快了不小心发表了。。。。
我原来的想法是既然1-1000这1000个数肯定存在,
那么可以在这个数组里找出这1000个数再找出最后一个剩下来的数的角标,
不过发现也是多次访问查找了。汗,只能同求答案- -
回复 使用道具 举报
我的想法是:
回复 使用道具 举报 0 1
问题问的不清楚啊,“只有一个数得复”是什么意思啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马