标签:
问题描述:将1~1000放在含有1001个元素的数组中,只有唯一的一个元素重复,其他均出现一次。请设计一个算法,将这个唯一重复的元素找出来,要求每个数组元素只能访问一次,且不能使用辅助存储空间。
解决方法1:根据题目描述只要将数组中的1001个数求和得到sum0,然后减去1到1000的和sum1就可以得到这个唯一的重复数字。
参考代码:
#include <bits/stdc++.h> using namespace std; int main() { srand(time(NULL)); int pos = rand() % 1002 ; int num = rand() % 1002 ; cout<<"随机产生的数字为: "<<num<<endl ; int sum0 = 0 ; int sum1 = 0 ; for( int i = 1 ; i <= 1000 ; i ++ ) { if( i == pos) { sum0 += num ; sum0 += pos ; } else { sum0 += i ; } sum1 += i ; } cout<<"唯一重复的数字为: "<<sum0 - sum1<<endl; }
GCC运行结果:
解题方法2:
该方法根据异或 a^b^a = b; 那么我们可以让出现两次的进行多进行一次异或,出现一次的多进行一次异或,也就是a^b^a^a^b =a;
(因为a^b^a=b b^a^b=a)
参考代码:
#include <bits/stdc++.h> using namespace std; int findRepeat(const int a[]) { int temp = a[0] ; for( int i = 1 ; i <1001 ; i ++ ) { temp ^= i; temp ^= a[i]; } return temp; } int main() { srand(time(NULL)) ; int num = rand() % 1002 ; cout<<"随机产生的数字为: "<<num<<endl ; int a[1001] ; memset( a , 0 , sizeof( a ) ) ; a[0] = num ; for( int i = 1 ; i < 1001 ; i ++ ) { a[i] = i ; } cout<<"唯一重复的数字为: "<<findRepeat(a)<<endl; }
GCC运行结果:
希望能够得到其他的解决方法。
转载请注明: http://www.cnblogs.com/zpfbuaa
标签:
原文地址:http://www.cnblogs.com/zpfbuaa/p/5366221.html