在《劍指offer》上有該題目的詳細解答:
題意爲給定一個整數數組,其中有兩個數只出現一次,其餘數出現兩次。要求線性時間、常量空間找出這兩個數。
我們知道,兩個相等的數異或結果爲0。因此,首次掃描數組,得到兩個單獨的數A、B的異或結果AxorB。因爲A和B不相等,因此AxorB一定不爲0,且二進制位爲1的位A和B一定不同。任取AxorB中某一位爲1的位,可以將原數組元素分成兩組異或即得結果。這裏取從最低位到最高位爲1的位(low to high)
這裏注意:java常用字節
1.整型
類型 存儲需求 bit數 取值範圍 備註
int 4字節 4*8
short 2字節 2*8 -32768~32767
long 8字節 8*8
byte 1字節 1*8 -128~127
2.浮點型
類型 存儲需求 bit數 取值範圍 備註
float 4字節 4*8 float類型的數值有一個後綴F(例如:3.14F)
double 8字節 8*8 沒有後綴F的浮點數值(如3.14)默認爲double類型
3.char類型
類型 存儲需求 bit數 取值範圍 備註
char 2字節 2*8
4.boolean類型
類型 存儲需求 bit數 取值範圍 備註
boolean 1字節 1*8 false、true
public int[] singleNumber(int[] nums) {
int[] ans = new int[2];
ans[0] = 0;
ans[1] = 0;
int res = 0;
for(int i = 0;i < nums.length; ++i){
res ^= nums[i];
}
int index = getFirstOneBit(res);
for(int i = 0;i < nums.length;++i){
if(isBit1(nums[i],index)){
ans[0] ^= nums[i];
}else{
ans[1] ^= nums[i];
}
}
return ans;
}
public boolean isBit1(int num,int index) {
num = num >> index;
return ((num & 1) == 1);
}
//low to high find the one digit;
//取的是最低位數,如果一開始爲0,直接就是1了。
public int getFirstOneBit(int num) {
int indexBit = 0;
while((num & 1) == 0 && (indexBit < 32)){
//>>代表除以2;
num = num >> 1;
++indexBit;
}
return indexBit;
}