题目
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思考
- 异或操作,二进制数的每位进行异或,相同为0,不同为1.
- 两个相同的数进行异或,结果为0。
- 如果题目 改为 “只有一个数只出现过一次,其他的都出现了2次”,全部数字异或运算,最终的结果就是只出现一次的数字,解题如下
public int findNum(int nums[]) {
int result = 0;
for (int num : nums) {
result = result ^ num;
}
return result;
}
- 本题中有两只出现过1次的数字,那么所有数字异或的结果即为那两个单一数字异或的结果。
- 接下来要做的是,把数组划分成两组A、B,两个出现一次的数字分在不同的组里,相同的数字分在同一个组了,这样就把问题转换成上面的形式了
- 两个不同的数异或,不同的位,值为1,利用这个特点就划分两个组了。
result = result & -result
得到出 result 最右侧不为 0 的位
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int result = 0;
for (int num : array) {
result = result ^ num;
}
result = result & -result;
for (int num : array) {
if ((num & result) == 0) {
num1[0] = num1[0] ^ num;
} else {
num2[0] = num2[0] ^ num;
}
}
}