題目:
Given an array nums containing n distinct numbers in the range [0, n], return the only number in the range that is missing from the array.
給定一個陣列,裡面本來應該有0~n的數各一,找出缺少的那個數
ex:input:[3,0,1]=>output:2
這題的解法有好幾種
先從直觀的開始講好了
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        if 0 not in nums: #先確認missing number是不是0
            return 0
        
        nums.sort()
        for i in range(len(nums)-1):
            if nums[i]+1 != nums[i+1]:
                return nums[i]+1
            
        return len(nums) #都沒找到不連續的點,代表missing number在尾端
先將陣列排序後再遍歷
一發現不連續的點,即代表發現missing number的位置
且記得考量到missing number在頭尾的可能
最後執行時間140ms(faster than 92.08%)
也有不用事先排序的解法
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        total=0
        for i in range(1,len(nums)+1):
            total=total+i
        return total-sum(nums)
只要算出0~n的總和,再減去陣列數的總和
結果就是我們要的missing number
最後執行時間128ms(faster than 98.93%)
接下來這個解法是在討論區看到的
我也沒想到這題居然能用位元運算下去解
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        xsum = 0
        for x in nums: 
            xsum ^= x
        
        for i in range(len(nums)+1):
            xsum ^= i
        
        return xsum
設一數0和nums每個數做^運算,再和0~n每個數做^運算,最後的結果就是missing number
至於為什麼,我們以[3,0,1]為例,操作起來如下
0^3^0^1^0^1^2^3經過交換律後變為
0^0^0^1^1^2^3^3又x^x=0
0^0^2^0=0^2=2,而2就是我們要的missing number
最後執行時間133ms(faster than 97.07%)
那我們下題見