【LeetCode 中等題】64-只出現一次的數字II
阿新 • • 發佈:2019-01-11
題目描述:給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 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