LeetCode 探索初級算法-數組:05 只出現一次的數字-20200317

05 只出現一次的數字-20200317

題目

給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

示例

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

說明

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


注意事項

  1. 整數數組非空,按照題目要求,數組最少有三個數字。
  2. 時間複雜度是O(N),最好一個循環內搞定。
  3. 不新開存儲空間。

思路一

先對數組排序,然後一次遍歷,找到三個相鄰指針不一樣的,中間那個指針就是。

修改經歷:

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)

思路三

朋友,聽說過異或嗎?大神就是不一般啊!下面就是大神的思路。

  • a \bigotimes 0=a
  • a\bigotimes 0 = a
  • a\bigotimes a\bigotimes b=0\bigotimes b=b

所以只要將所有的項都異或起來就可以得到只出現一次的項了。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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章