题目一:数组中只出现一次的两个数字
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
解决:
利用异或
public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
int res=0;
//求出要寻找的两个数的异或值
for(int i=0;i<array.length;i++){
res^=array[i];
}
int count=0;
//找出最右边为1的二进制位
for(;count<array.length;count++){
if((res&(1<<count))!=0) break;
}
//计算
for(int i=0;i<array.length;i++){
if((array[i]&(1<<count))!=0) num1[0]^=array[i];
else num2[0]^=array[i];
}
}
题目二:数组中唯一只出现一次的数字
在一个数组中除一个数字只出现一次之外,其他数字都出现了三次,请找出那个只出现一次的数字。
解决:
异或。
public int findNumberAppearingOnce(int[] numbers,int length){
int[] bitSum=new int[32];
for(int i=0;i<length;i++){
int bitMask=1;
for(int j=31;j>=0;j--){
int bit=numbers[i]&bitMask;
if(bit!=0){
bitSum[j]+=1;
}
bitMask=bitMask<<1;
}
}
int res=0;
for(int i=0;i<32;i++){
res=res<<1;
res+=bitSum[i]%3;
}
return res;
}