常用算法之8---找到数组中只出现一次的数字

题目:一个数组中的元素,只有一个数字出现了一次,其他的元素都出现两次。找出出现一次的这个数字。

示例: {1,2,1,3,2,4,4}
输出:3

方案1:先将数组进行排序,这个数字一定是出现在第奇数位上(从1开始计数),并且这个数和后面的数不相同。
          若没有找到这个数字,则其为排序后的最后一个数字。
分析:进行排序的时间复杂度O(nlogn),再遍历一遍为O(n),则总体时间复杂度为O(nlogn)。

 

方案2*:若数组中不含有0和1,可令sum= a[0]*a[1]*...*a[n-1]。
          然后再遍历一遍数组,看a[i]是否能整除sum两次,若不能,即为所求。
分析:为求得sum,需要遍历一次数组,O(n)。然后又要验证一遍,O(n)。
         综上,总的时间复杂度为O(n)。

 

方案3:根据异或的特性:相同两数异或为0,不同两数异或为1。
          将所有的数进行异或操作,则最终的结果即为所求。
代码:

for(int i =1;i<a.length;i++)
    a[0] ^= a[i];
print(a[0]);

分析:仅遍历一遍,故时间复杂度为O(n)。

 

建议:自己使用一个示例,使用上述方法自己演示一下,加深了解。

扩展:若是有个数组,其中只有一个数N出现奇数次,其他的数都出现偶数次,怎样找到N?

posted @ 2013-09-16 19:15  欧麦高德  阅读(326)  评论(1编辑  收藏  举报