劍指 Offer 56 - I. 陣列中數字出現的次數

RainsX發表於2021-09-23

在這裡插入圖片描述
java:
先把陣列的數字異或在一起tem<相異為1>
找到tem第一個為1的數字<兩個出現一次的數字異或後說明兩個數在這個位置上數字不一樣>
把陣列的數字以這個位置上的數字分類分別異或,最後得到兩個數字

class Solution {
    public int[] singleNumbers(int[] nums) {
        int tem = 0;
        for (int i = 0; i < nums.length; i++) {
            tem ^= nums[i];
        }
        int cmp = 1;
        while ((tem & cmp) == 0) {//cmp其他位置都是0,與其他&之後都是0,只有cmp的位置tem是1才!=0
            cmp <<= 1;//<<=不是<<
        }
        int res1 = 0, res2 = 0;
        for (int i = 0; i < nums.length; i++) {
            if ((nums[i] & cmp) == 0) 
                res1 ^= nums[i];
            else 
                res2 ^= nums[i];
        }
        return new int[]{res1, res2};
    }
}

相關文章