数组中寻找重复的数

来源:互联网 发布:知乎周刊 pdf 下载 编辑:程序博客网 时间:2024/04/29 13:57

题目:

有一个数组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 100int 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;}

结果: