1. 程式人生 > >LeetCode260——只出現一次的數字III

LeetCode260——只出現一次的數字III

我的LeetCode程式碼倉:https://github.com/617076674/LeetCode

原題連結:https://leetcode-cn.com/problems/single-number-iii/description/

題目描述:

知識點:位運算

思路:位運算

假設兩個只出現一次的元素分別是num1和num2,按照LeetCode136——只出現一次的數字中的思路,我們很容易得到num1 ^ num2的結果num1XORNum2。將num1XORNum2表示成二進位制數的形式,其中為1的位說明num1和num2的該位的值是不相同的。我們取num1XORNum2二進位制數形式的最右邊的那個1,而其餘位均置0,用這個數來將原陣列nums中的元素分成兩種型別:

(1)該位是1。

(2)該位是0。

由於num1和num2的該位的值是不相同的,這樣的分類顯然將num1和num2分別放進了上述兩種分類中。這時候我們再採用LeetCode136——只出現一次的數字中的思路遍歷一次nums陣列即可。

時間複雜度是O(n)。空間複雜度是O(1)。

JAVA程式碼:

public class Solution {
    public int[] singleNumber(int[] nums) {
        int num1XORNum2 = 0;
        for (int i = 0; i < nums.length; i++) {
            num1XORNum2 ^= nums[i];
        }
        num1XORNum2 &= -num1XORNum2;
        int[] result = new int[2];
        result[0] = result[1] = 0;
        for (int i = 0; i < nums.length; i++) {
            if(0 == (nums[i] & num1XORNum2)){
                result[0] ^= nums[i];
            }else{
                result[1] ^= nums[i];
            }
        }
        return result;
    }
}

LeetCode解題報告: