首先考虑一个简单问题:一个数组里除了一个数字之外,其他的数字都出现了两次,找出这个只出现一次的数字。
根据数字出现的次数,我们想到了异或运算的性质:任何一个数字异或它自己都等于0 。我们从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,那么最终的结果刚好是那个只出现一次的数字。
代码如下:
/**一个数组里除了一个数字之外,其他的数字都出现了两次,找出这个只出现一次的数字*/
public int FindNumAppearOnce(int[] array){
if (array == null || array.length == 0)
return;
int len = array.length, res = 0;
for(int i = 0; i < len; i++){
res = res ^ array[i];
}
return res;
}
然后考虑这个问题的变种版本:一个整型数组里除了两个数字之外,其他数字都出现了两次。 找出这两个只出现一次的数字。
根据上面思路:如果将所有所有数字相异或,则最后的结果肯定是那两个只出现一次的数字异或的结果。 所以根据异或的结果1所在的位,把数字分成两个子数组,分组标准是数字在这个位上的值是否为1;每一半里含有只出现一次的数据和成对出现的数据,这样继续对每一半相异或则可以分别求出两个只出现一次的数字。
代码如下:
/**一个数组里除了二个数字之外,其他的数字都出现了两次,找出这个