[算法题] 找出数组中唯一出现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; }