1. 程式人生 > >【LeetCode 簡單題】70-缺失數字

【LeetCode 簡單題】70-缺失數字

宣告:

今天是第70道題。給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一個包含 0, 1, 2, ..., n 中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。

示例 1:

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

示例 2:

輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8

說明:
你的演算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?

解法1。線性時間。先對nums排序,再使用列舉enumerate方法,如果key和value不相等代表缺失了與key相等的數字,程式碼如下。

執行用時: 52 ms, 在Missing Number的Python提交中擊敗了35.62% 的使用者

class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        # 長度為1時只可能有2種情況,就是為1或者0
        if len(nums)==1:
            if nums[0]==0:
                return 1
            if nums[0]==1:
                return 0
        
        nums.sort()
        for key,val in enumerate(nums):
            if key != val:
                return key
            else:
                continue
        return nums[-1]+1  # 如果當前序列不缺元素,則返回最後1個元素加1

 解法2。如果缺失的數字出現在中間,那麼可以利用等差數列的求和公式求出它完整時的和,再減去實際的和就是缺失的那個數字,程式碼如下。

執行用時: 32 ms, 在Missing Number的Python提交中擊敗了99.08% 的使用者

class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        nums_sum = sum(nums)
        supposed_sum = len(nums)*(len(sum)+1)/2
        return supposed_sum-nums_sum

 解法3。這種方法真的精妙,如果nums一開始是無序的且肯定缺了1個數,那麼假設這個數是i,放在index為len(nums)這個位置上,也就是最後1個,那麼就構成了1個完整的序列,該完整序列的值和index都異或,得出結果肯定為0,套用下面的異或法則,因為完整的index和value一定相等嘛,現在把i單獨抽出來,[3,1,0,i]全員異或的公式就變為:3⊕0⊕1⊕1⊕0⊕2⊕i⊕len(nums)=3⊕0⊕1⊕1⊕0⊕2⊕len(nums)⊕i=0,i=3⊕0⊕1⊕1⊕0⊕2⊕len(nums),程式碼實現如下。

  • a^b=1
  • a^a=0
  • a^b^a=b

執行用時: 40 ms, 在Missing Number的Python提交中擊敗了64.38% 的使用者

class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        i_index = len(nums)
        for i in range(len(nums)):
            i_index ^= (i^nums[i])
        return i_index            

解法4。用set這個資料結構,根據給定的序列,構造一個對應的完整的序列,再找2者的不同元素,pop出來正好有現成的API,程式碼如下。

執行用時: 40 ms, 在Missing Number的Python提交中擊敗了64.38% 的使用者

  • set(a).difference(b):返回的是集合a、b的不同元素構成的集合
  • .pop():就是把返回的集合元素彈出,這裡面只有1個元素,就是缺失的那個元素
class Solution(object):
    def missingNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return set(range(len(nums)+1)).difference(set(nums)).pop()

結尾

解法1:https://blog.csdn.net/qq_34364995/article/details/80699747

解法2&解法3:https://blog.csdn.net/u014251967/article/details/52473505

解法4:LeetCode