题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
我看到这个题的思路就是HashMap,但看看给出的代码模板,出题意图并不是这样。
剑指那本书看了不易懂,这个哥们儿翻译的的非常通俗有重点了。
运行时间:17ms
占用内存:9672k
位运算的优先级低,在和==组合时要括起来.
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int [] array, int num1[] , int num2[]) {
if(array == null || array.length < 2)
return;
if(array.length == 2){
num1[0] = array[0];
num2[0] = array[1];
return ;
}
//找出全组异或后第一个1所在位置
int bit = array[0];
for(int i=1; i<array.length; i++)
bit ^= array[i];
int index = 0;
while(bit != 0 && (bit&1) == 0){
index++;
bit >>= 1;
}
//按该位是不是1分组,异或每组得到唯一不同的数
for(int i=0; i<array.length; i++){
if(((array[i] >> index)&1) == 1){
num1[0] ^= array[i];
}
else{
num2[0] ^= array[i];
}
}
}
}