05 只出現一次的數字-20200317
題目
給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
示例
輸入: [2,2,1]
輸出: 1
說明
你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
注意事項
- 整數數組非空,按照題目要求,數組最少有三個數字。
- 時間複雜度是O(N),最好一個循環內搞定。
- 不新開存儲空間。
思路一
先對數組排序,然後一次遍歷,找到三個相鄰指針不一樣的,中間那個指針就是。
修改經歷:
1. 不是最少三個數字嗎,你給我個[1],我心態崩了啊!(第一次提交)
- 執行用時 :84 ms, 在所有 Python3 提交中擊敗了74.65%的用戶
- 內存消耗 :15.1 MB, 在所有 Python3 提交中擊敗了64.46%的用戶
2. 雖然沒有開闢新的空間,但是這裏的內存消耗有點大。不過平臺每次提交都會有稍許的差別,在提交一次。(第二次提交)
- 執行用時 :48 ms, 在所有 Python3 提交中擊敗了87.08%的用戶
- 內存消耗 :15 MB, 在所有 Python3 提交中擊敗了93.98%的用戶
3. 第二次提交結果說明,大部分答案都集中用時40-100ms,內存更是集中在15MB左右。
心得體會:
排序還是很好用的,先排序再找元素,只要不要索引就行。
最終代碼展示:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
nums.sort()
if len(nums) > 1:
for i in range(1, len(nums)-1):
if nums[i-1] != nums[i] and nums[i] != nums[i+1]:
return nums[i]
elif i == len(nums)-2 and nums[i-1] == nums[i] and nums[i] != nums[i+1]:
return nums[i+1]
elif i == 1 and nums[i-1] != nums[i] and nums[i] == nums[i+1]:
return nums[i-1]
else:
return nums[0]
思路二
看到題解的方法,不得不的說大神還是大神。就一個公式 2∗(a+b+c)−(a+a+b+b+c)=c。
最終代碼展示:
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return 2 * sum(set(nums)) - sum(nums)
思路三
朋友,聽說過異或嗎?大神就是不一般啊!下面就是大神的思路。
所以只要將所有的項都異或起來就可以得到只出現一次的項了。Python 3的位操作,參看知識點 Python 中的 位運算符
最終代碼展示:
class Solution(object):
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
a = 0
for i in nums:
a ^= i
return a