黑马程序员技术交流社区

标题: 设计一个算法找 出这个数字.说明:每个元素只能被访问一次 [打印本页]

作者: 铿锵科技    时间: 2013-8-7 21:07
标题: 设计一个算法找 出这个数字.说明:每个元素只能被访问一次
本帖最后由 铿锵科技 于 2013-8-10 23:22 编辑

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

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

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

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


作者: 夜空闪亮    时间: 2013-8-7 22:20
问题问的不清楚啊,“只有一个数得复”是什么意思啊?
作者: breaveheart    时间: 2013-8-8 09:49
我的想法是:

作者: breaveheart    时间: 2013-8-8 09:53
不好意思打快了不小心发表了。。。。
我原来的想法是既然1-1000这1000个数肯定存在,
那么可以在这个数组里找出这1000个数再找出最后一个剩下来的数的角标,
不过发现也是多次访问查找了。汗,只能同求答案- -
作者: breaveheart    时间: 2013-8-8 10:03
只要找出这个数啊- -  昏。那我倒是有思路了。
对这个数组用角标的方式求和得num,
又因为1-1000个数肯定都出现一遍,
所以直接用num-(1+1000)*500就行了,
求得的就是重复的数。
作者: 单凯    时间: 2013-8-8 10:35
本帖最后由 单凯 于 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的和。


作者: 白堇翎    时间: 2013-8-8 13:30
数组==>ArrayList==>HashSet==>ArrayList.removeAll(HashSet)===>得到那个重复的数字
这样行不行?
作者: 心灵之歌    时间: 2013-8-8 13:38
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);

        }
作者: 夜写意    时间: 2013-8-8 14:57
不可能实现吧?按照你的意思,就是一访问到这个数就知道他是不是那个重复的数了。通过比较或者转成集合,都不止访问一次。除非是通过数学的算法。那这样又不是程序的算法了。
数学的算法可以用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;
复制代码

作者: 铿锵科技    时间: 2013-8-10 23:15
谢了楼上的多位辛苦了!
作者: 会飞的狼    时间: 2013-8-10 23:31
容量为1001的数组,每个位置中的数都是1——1000范围内的,只有一对是重复的,那么肯定是1——1000中每个数字都出现了一次,只有一个出现了两次,那么你对这个数组进行求和就行了int sum = 0,x=0;
                   for(int i:arr)
                   {
                        sum +=i;
                     }
                  循环结束后用sum减去1加到1000的和就是那个重复的数了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2