LeetCode260——只出現一次的數字III
阿新 • • 發佈:2019-01-07
我的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解題報告: