[算法题] 找出数组中唯一出现2次的数

这个好像是微软的面试题,题目是这样的:

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

也就是说有一个整形数组,数组一共有1001个元素,每个元素的值都在1和1000之间. 其中有一个元素出现了2次(所以会有1001个元素),其他所有数字都只出现了一次, 我们现在要快速找出出现了2次的这个元素

 

这个题目有一个非常巧妙的解决方法:

这个1001个整数的数组,它的和加起来应该就等于   1+2+3+4+......+1000(从1加到1000) 的值    +  重复的那个元素的值 

也就是说,我们把这个数组中1001个整数的值加起来  -    (1+2+3+4+......+1000 的值 )  =  重复的那个元素的值, 这样我们就能快速把重复的那个元素找出来

 

1+2+3+4+5+.........+1000  应该怎么算呢 ?  =》方法如下:

第1个元素 + 最后1个元素  (1 + 1000) = 1001

第2个元素 + 倒数第2个元素 (2 + 999) = 1001

第3个元素 + 倒数第3个元素 (3 + 998) = 1001   ......依此类推,很显然,总共有500(1000/2=500)个1001, 所以它的和就等于 (1001 * 1000) / 2 

整个代码如下

int GetDuplicateValue(int[1001] a)
{
int arrSum = 0;
int compareValue = (10001 * 1000) / 2;
for(int i = 0; i < 1001; i++)
{
arrSum += a[i];
}
return arrSum - compareValue; }

 

posted on 2023-02-07 17:06  新西兰程序员  阅读(113)  评论(0编辑  收藏  举报