题目:一个数组中的元素,只有一个数字出现了一次,其他的元素都出现两次。找出出现一次的这个数字。
示例: {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?