陣列中只出現一次的數字(Java)
阿新 • • 發佈:2018-12-26
題目:
一個整型數組裡面除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字,要求時間複雜度是O(n),空間複雜度是O(1)。
思路:
利用異或去重的思想
程式碼實現:
public class Main { public static void findNumsAppearOne(int nums[]){ int len = nums.length; if(len < 2){ return ; } int AllXOR = 0; for(int i = 0; i < nums.length; i++){ AllXOR ^= nums[i]; } //找到AllXOR中第一位為1的位置 int res = findFirstBit1(AllXOR); int num1 = 0, num2 = 0; for(int i = 0; i < nums.length; i++){ if(isBit1(nums[i], res)){//根據一特定位置是否為1,將陣列分為兩個子陣列進行判斷,每一個子陣列中包含一個只出現一次的數字 num1 ^= nums[i]; }else{ num2 ^= nums[i]; } } System.out.println(num1 + " " + num2); } //num&(-num)是把最右邊的1保留下來 private static int findFirstBit1(int num) { return num&(-num); } //判斷某一特定位置是不是1 public static boolean isBit1(int data, int res){ return ((data & res) == 0) ? false : true; } }