數組中只出現一次的數字
題目描述
一個整型數組里除了兩個數字之外,其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。
思路
- 先考慮一個數組里只有一個數出現一次,其他兩個數都出現兩次的情況:一個數跟自己異或后為0,一個數組里只有一個數出現一次其他兩次,挨個異或后最后得到的結果就是只出現一次的那個數。
- 我們把這個數組分為兩部分,每部分只有一個數只出現一次:我們分的時候,把所有數都異或后,得到的結果肯定不為0,其實是那兩個只出現一次的不同的數的異或,我們從低位到高危找到第一個不為0的那位,異或后這兩個數的這位上肯定是一個為1一個為0,所以我們根據這位將整個數組分為兩部分,這位上為1的和這位上為0的,這樣就保證這兩個只出現一次的數會被分到兩個部分中,然后每部分按只有一個只出現一次的方法解決即可。
代碼
//num1,num2分別為長度為1的數組。傳出參數 //將num1[0],num2[0]設置為返回結果 public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { if (array == null || array.length == 0) { return; } if (array.length < 2) { num1[0] = 0; num2[0] = 0; return; } int temp1 = array[0]; for (int i = 1; i < array.length; i++) { temp1 = temp1 ^ array[i]; } int firstBit = 0; while (((temp1 & 1) == 0) && (firstBit < 32)) { firstBit++; temp1 = temp1 >> 1; } num1[0] = 0; num2[0] = 0; for (int i = 0; i < array.length; i++) { if (isBit(array[i], firstBit)) { num1[0] = num1[0] ^ array[i]; } else { num2[0] = num2[0] ^ array[i]; } } return; } public boolean isBit(int num, int indexBit) { num = num >> indexBit; return (num & 1) == 1; } }
