题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解体思路
先考虑只有一个出现一次的数字: 利用异或的特性,x^y^x=y^x^x=y。对数组所有元素一次进行异或操作,最终得到的值就是那个只出现一次的数字。
现在考虑有两个只出现一次的数字: 假设两个只出现一次的数字分别为a、b,对数组元素进行两两异或后得到的值为c,可知c=a^b。因为a和b一定不同,所以c不等于0,那么c的二进制表示中一定有一位是1,即a,b在此位上分别为0,1或1,0。假设该位置是从低位起第x位,那么将数组分成两组,一组中的数字在第x位是0,另一组中的数字在第x位是1,则a和b分别属于两个子数组。分别求子数组中唯一只出现1次的数字,即可得到a和b
代码实现:
public class Solution {
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
if(array == null || array.length < 2) {
num1[0] = 0;
num2[0] = 0;
return;
}
int sum = 0;
for(int num : array)
sum ^= num;
sum &= -sum;
for(int num : array) {
if((num & sum) == 0) {
num1[0] ^= num;
} else {
num2[0] ^= num;
}
}
}
}