以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  一道找工作的笔试题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=39585)


--  作者:cozy1984
--  发布时间:10/31/2006 11:33:00 PM

--  一道找工作的笔试题
有1-1000的数字存放在一个空间为1001的数组中,其中只有两个是重复的.问怎样可以做到数组的每个元素只被访问一次且不能用辅助存储空间就能够找出那个重复的数字?

我设想的是用一个数组A[3][10]来实现,我想这应该不算题目所说的辅助存储空间吧.


--  作者:kouyan
--  发布时间:11/1/2006 1:15:00 AM

--  
我觉得你都开了一个数组A[3][10],应该是辅助存储空间吧,难道只有new一个才算开存储空间吗,那我静态空间开多大都可以了,这样的话应该比较的就是谁能用最小的空间来实现了吧。

这个“数组的每个元素只被访问一次”该怎么理解呢?是不是只能读一次后就再也不能读和写了,我觉得再写也是访问了(在操作系统上是这么定义的)。

我觉其实可以利用数组的下标值来做。


--  作者:kouyan
--  发布时间:11/1/2006 8:33:00 AM

--  
我的方法,每个元素只读一次:
假设原来的数组是a[1001],
那个重复的数字是(a[0] + a[1] + .....+ a[1000]) - (1 + 2 + .....+ 1000)
--  作者:carroty
--  发布时间:11/1/2006 9:22:00 AM

--  
这个牛!

:)


--  作者:lionx
--  发布时间:11/1/2006 9:32:00 AM

--  
如果只用一个辅助空间的话效率就会提高很多: while (A[0]!=A[A[0]])
 {
  temp = A[0];
  A[0] = A[temp];
  A[temp] = temp;
 }//A是数组,循环结束后A[0]就是那个重复的数。原理就是变换群的性质。其实辅助空间的定义很不确定。数组内循环用的i算不算
--  作者:kouyan
--  发布时间:11/1/2006 10:00:00 AM

--  
以下是引用lionx在2006-11-1 9:32:00的发言:
如果只用一个辅助空间的话效率就会提高很多: while (A[0]!=A[A[0]])
  {
   temp = A[0];
   A[0] = A[temp];
   A[temp] = temp;
  }//A是数组,循环结束后A[0]就是那个重复的数。原理就是变换群的性质。其实辅助空间的定义很不确定。数组内循环用的i算不算

我觉得你这样把数组的原来存储顺序都给破坏了,应该不行吧,
而且你不停的读写了A[0],这与题意“数组的每个元素只被访问一次”不符吧


[此贴子已经被作者于2006-11-1 11:42:16编辑过]

--  作者:w84u
--  发布时间:11/1/2006 2:09:00 PM

--  
int FindDup(int A[])
{
 //找出第一个存放不是自身的元素
 for(i=0;i<1001;i++)
     {
        if(a[i]!=i)
        break;
     }


 //如果第一个存放不是自身的元素是a[1000],即1000就是所要找的位置
    if(i=1000)
      return i;
 

 //如果第一个存放就不是自身元素,则人工进行循环,原因下面叙述.
 if(0 == i)
  {
   i=a[0];
   a[0]=0;
  }

 //循环进行条件a[i]!=i;
 //一旦元素被遍历,则先元素指向的元素赋值给i,然后将元素指向自身a[i]=i;
 //因为即要保存元素,又要保存元素指向的元素 需要交换必须有tmp变量
 //这就是人工循环i=0的原因,因为a[0]已经被遍历 且遍历之后a[0]被赋值0
 //所以a[0]可以用来做tmp变量
 //只不过交换之后要对a[0]赋值0,利用之后要还原现场,呵呵

    while(a[i]!=i)
     {
         a[0] =a[i];
         a[i]=i;
         i=a[0];
   a[0]=0;
      }
 //循环必能退出,因为如果每个a[i]存放都是i的话 就与题目1001数组存放1-1000矛盾.
 return i;
}


--  作者:w84u
--  发布时间:11/1/2006 2:12:00 PM

--  
倒 3楼正解
掉陷阱了
--  作者:kiangb
--  发布时间:11/2/2006 10:53:00 AM

--  
同意三楼的
[此贴子已经被作者于2006-11-2 23:21:33编辑过]

--  作者:computerlover
--  发布时间:11/4/2006 7:14:00 PM

--  
三楼的强,我估计这个题是考智力的,看你想没想到三楼的方法,倒不是考DS方面的知道,像算法的时空效率,
--  作者:cozy1984
--  发布时间:11/5/2006 12:16:00 AM

--  
三楼的强,真是山外高人!
迎面清风,豁然开朗!
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
156.250ms