分享

1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次

 liema2000 2008-07-24

1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现
一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空
间,能否设计一个算法实现?
1001个元素相加减去1,2,3,……1000数列的和,得到的差即为重复的元素。
  int   Find(int   *   a)  
  {  
  int   i;//
变量  
  for   (i   =   0   ;i<=1000;i++)  
  {  
  a[1000]   +=   a[i];  
  }  
  a[1000]   -=   (i*(i-1))/2       //i
的值为1001  
  return   a[1000];  
  }
利用下标与单元中所存储的内容之间的特殊关系,进行遍历访问单元,一旦访问过的单
元赋予一个标记,利用标记作为发现重复数字的关键。代码如下:
void FindRepeat(int array[], int length)
{
    int index=array[length-1]-1;
    while ( true )
    {
       if ( array[index]<0 )
           break;
       array[index]*=-1;
       index=array[index]*(-1)-1;
    }
 
    cout<<"The repeat number is "<<index+1<<endl;
}
此种方法不非常的不错,而且它具有可扩展性。在坛子上有人提出:
对于一个既定的自然数 N ,有一个 N + M 个元素的数组,其中存放了小于等于 N 的所有
自然数,求重复出现的自然数序列{X}
 
对于这个扩展需要,自己在A_B_C_ABC(黄瓜儿才起蒂蒂)的算法的基础上得到了自己的算法
代码:
按照A_B_C_ABC(黄瓜儿才起蒂蒂)的算法,易经标记过的单元在后面一定不会再访问到,除非它是重复的数字,也就是说只要每次将重复数字中的一个改为靠近N+M的自然数,让遍历能访问到数组后面的单元,就能将整个数组遍历完。
代码:
*/
void FindRepeat(int array[], int length, int num)
{
 int index=array[length-1]-1;
 cout<<"The repeat number is ";
 while ( true )
 {
 if ( array[index]<0 )
 {
   num--;
   array[index]=length-num;
   cout<<index+1<<‘t‘;
 }
 
 if ( num==0 )
 {
   cout<<endl;
  return;
 }
 array[index]*=-1;
 index=array[index]*(-1)-1;
 }
}
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多