题目:
有一个数组a[100],其中存储了1-99的整数,且只有一个数字是重复的。且数组无序。
要求实现一个算法给出这个重复的数(要求考虑时间复杂性和空间复杂性)。方法1:按位异或,利用a^b^b=a的原理,(推荐)
xor = a[0]^a[1]^.....a[99]
重复的那个值 = xor^1^2^3······98^99
方法二:利用和sum1=1+2+3+.....99; (推荐)
sum2=a[0]+a[1]+.....a[99];
sum2-sum1=重复的那个值
方法三:利用Set的不可重复属性
遍历一次数组,一次插入到set中,每插入一次就检查set的长度是否发生了变化。不过这个方法空间复杂度为O(n)
方法四:利用hash。开辟长度即为100的新数组.遍历插入,检查是否存在冲突,若存在就可断定其为重复值。
#include "stdafx.h"
#include <STDIO.H>
#define MAX 100
int main(int argc, char* argv[])
{
int testArray[MAX];
for (int i=0;i<MAX-1;i++)//初始化
{testArray[i] = i+1;
}
testArray[MAX-1] = 7;//假定重复的数是 7
//按位异或计算
int xor = 0;//按位异或
for (i = 0; i < MAX; i++)
{
xor ^= testArray[i];
xor ^= i;
}
printf("按位异或计算,重复的数是:%d\n",xor);
//利用求和
int sum = 0;//按位异或
for (i = 0; i < MAX; i++)
{
sum += testArray[i];
}
int sum2 = (1+(MAX-1))*(MAX-1)/2;
printf("按求和方法计算,重复的数是:%d\n",sum-sum2);
return 0;
}
结果: