位運算 -- 只出現一次的的數字
阿新 • • 發佈:2018-11-07
異或的兩個值'相同為假,不同為真'。
交換兩個整數的值時可以不用第三個引數
a = a ^ b ^ a = b
b = b ^ a ^ b = a
一個只出現一次的數字。
一個整型數組裡除了一個數字之外,其他的數字都出現了偶數次。請寫程式找出這個只出現一次的數字。
public int oneNumsAppearOnce(int [] array ){ int num = 0; if(array.length>0){ for(int i = 0; i<array.length; i++){ num ^= array[i]; } } return num; }
兩個只出現一次的數字。
先舉出一個數組:{5,3,2,1,2,5}
最終異或結果:1^3 = 0010
那麼第二位是1,則說明兩個單獨出現的數的第二位不同;
那麼我們可以根據這個條件對陣列進行分組:第二位為1的為一組,第二位為0的為一組;然後每一組進行異或,
得到的兩個結果就是單獨出現的倆個數!
//num1,num2分別為長度為1的陣列 將num1[0],num2[0]設定為返回結果 public void twoNumsAppearOnce(int [] array,int num1[] , int num2[]) { int num = 0; if(array.length>0){ int index = 0 ; num1[0] = 0; num2[0] = 0; for(int i = 0; i<array.length; i++){ num ^= array[i]; } for(int i = 0; i<32; i++){ if( ( (num >> i) & 1 ) == 1 ){ //右移 找到第一個為1的位; index = i; break; } } for(int j = 0; j<array.length; j++){ if( ((array[j] >> index) & 1 ) == 1){ num1[0] ^= array[j]; }else { num2[0] ^= array[j]; } } } System.out.println(""+num1[0] + "+" + num2[0] + ""); }