Maison  >  Article  >  base de données  >  数组中出现2次

数组中出现2次

WBOY
WBOYoriginal
2016-06-07 15:09:571212parcourir

假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你 只能对这个数组做一次处理 ,用一种算法找出重复的那个数字。 如果你在运算中使

假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?

分析

方法一使用辅助的存储方式该选择何种存储方式呢可使用hash的存储方式,以1到1000作为hash表的索引,遍历原数组,统计各数字出现的个数并存储到以该数字为索引值的hash表中,若某个hash[x]的值为2则退出循环,x就是重复出现两次的数字。时间复杂度最坏是O(n)。优点:高效率,缺点:消耗的内存空间过大。代码如下:

[cpp] view plaincopyprint?

  1. int fun1(const int a[])  
  2. {  
  3.   int hash[1002]={0};  
  4.   int x=0;  
  5.   for(int i = 0; i
  6.     {  
  7.       if((++hash[a[i]]) == 2)  
  8.         {  
  9.           x = a[i];  
  10.           break;  
  11.         }  
  12.     }  
  13.   return x;  
  14. }  
int fun1(const int a[])
{
  int hash[1002]={0};
  int x=0;
  for(int i = 0; i

<p><span>方法二</span><span>、<u>若不使用辅助的存储方式呢</u>?</span><span>已<span><span>知</span><span>1001个整数组成的数组只有一个数字出现了两次,且整数都在1到1000之间,</span></span><span>所以可推得数组里面包含了1到1000之间的所有数字为[1,2,3……1000]和一个出现两次的x为1到1000中的任一个数字。这样就可以计算原数组里的所有数字之和S1和等差数列[1,2,3……1000]</span></span><span>的和</span>S2,再计算S1与S2之差,该差就是原数组中出现两次的数字x。时间复杂度是固定的O(n)。<span>优缺点:内存空间消耗几乎没有,但是效率要输于使用hash表的存储方式。</span>代码如下:</p>

<p>
</p><p>
</p><p><strong>[cpp]</strong> 
view plaincopyprint?</p>

<ol>
<li><span><span>int</span><span> fun2(</span><span>const</span><span> </span><span>int</span><span> a[])  </span></span></li>
<li><span>{  </span></li>
<li><span>  <span>int</span><span> s1=0,s2;  </span></span></li>
<li><span>  s2 = 1001*1000/2;   </span></li>
<li><span>  <span>for</span><span>(</span><span>int</span><span> i = 0; i</span></span></li>
<li><span>    {  </span></li>
<li><span>      s1+=a[i];  </span></li>
<li><span>    }  </span></li>
<li><span>  <span>return</span><span> s1-s2;  </span></span></li>
<li><span>} </span></li>
</ol>



Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn