leetcode260. 只出現一次的數字 III

260.只出現一次的數字 III(中等)

給定一個整數數組 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。

示例:

輸入: [1,2,1,3,2,5]
輸出: [3,5]

注意:

  1. 結果輸出的順序並不重要,對於上面的例子, [5, 3] 也是正確答案。
  2. 你的算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?

解法一:

簡單暴力的解法,用字典來統計數組中數字出現的次數,然後返回,簡單快速,速度擊敗了98.83%。

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        dict = {}
        re = []
        for i in nums:
            if i in dict:
                dict[i] += 1
            else:
                dict[i] = 1
        for key in dict:
            if dict[key] == 1:
                re.append(key)
        return re

解法二

採用基礎題目中(136)的位運算法,回顧一下,一個數與0異或還是自己,與自己異或等於0,所以本題有2個單獨出現的數字,其他數字都出現2次,所以整個數組異或的結果應該就是這兩個數字的異或結果。

我們思考怎麼把這個問題分解成基礎問題,如果把兩個單獨出現的數字分別放到兩個組中,就分解成了兩個基礎問題,那麼怎麼分呢。

兩個數字異或的結果中,一定有一位爲1,我們可以通過這一位是不是1來進行分類,分成兩組,這樣就可以保證分成兩組,且每一組只有1個單獨出現的數字,再採用基礎問題中的方法就可以解決了。

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        xor = 0
        for num in nums:
            xor ^= num
        mask = 1
        while xor & mask == 0:
            mask <<= 1
        a, b = 0, 0
        for num in nums:
            if mask & num == 0:
                a ^= num
            else:
                b ^= num
        return [a, b]
發佈了20 篇原創文章 · 獲贊 7 · 訪問量 2864
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章