1. 程式人生 > >【LeetCode 中等題】64-只出現一次的數字II

【LeetCode 中等題】64-只出現一次的數字II

題目描述:給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

說明:

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

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

示例 2:

輸入: [0,1,0,1,0,1,99]
輸出: 99

解法1。利用數學,見下

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return
        nums_uni = list(set(nums))
        supposed_sum = sum(nums_uni)*3
        res = (supposed_sum - sum(nums))//2
        return res

解法2。按位檢查,檢視所有數該位上為1的個數,這個個數肯定是3的倍數或者3的倍數+1,所以除3取餘後就是target數在該位上是否為1的結果,如此下來,32位上是否為1的結果拼湊起來就可以還原該數。

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return
        res = 0
        for i in range(32):
            mask = 1<<i
            summ = 0
            for n in nums:
                if n&mask: 
                    summ += 1
            res |= (summ%3)<<i
        return res if res < 2**31 else res-2**32  # 若輸入是負數,所以需要進行範圍檢查

解法3。這種解法效率很高,真費解,還沒懂,下面這篇部落格有講解,好像是涉及狀態機的知識

https://blog.csdn.net/Koala_Tree/article/details/80228525

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if not nums:
            return
        a, b = 0, 0
        for n in nums:
            b = (b^n) & ~a
            a = (a^n) & ~b
        return b

參考連結:https://www.cnblogs.com/grandyang/p/4263927.html