iT邦幫忙

0

leetcode with python:268. Missing Number

  • 分享至 

  • xImage
  •  

題目:

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%)

那我們下題見


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言