题目
给定一个包含[0, n]中n个数的数组nums,找出[0, n]这个范围内没有出现在数组中的那个数。
进阶:
- 能否实现线性时间复杂度、仅使用额外阐述空间的算法解决此问题?

思路
思路一:排序后扫描整个数组
class Solution:def missingNumber(self, nums):nums.sort()# Ensure that n is at the last indexif nums[-1] != len(nums):return len(nums)# Ensure that 0 is at the first indexelif nums[0] != 0:return 0# If we get here, then the missing number is on the range (0, n)for i in range(1, len(nums)):expected_num = nums[i-1] + 1if nums[i] != expected_num:return expected_num
class Solution:def missingNumber(self, nums: List[int]) -> int:nums.sort()for i, num in enumerate(nums):if i != num:return ireturn len(nums)
思路二:哈希表
可以直接查询每个数是否在数组中出现过来找出缺失的数字。如果使用哈希表,那么每一次查询操作都是常数时间的。
class Solution:def missingNumber(self, nums):num_set = set(nums)n = len(nums) + 1for number in range(n):if number not in num_set:return number
思路三:位运算
- 异或:不同为1,相同为0。
- 0异或任何数都为任何数。
- 异或运算(XOR):对一个数进行两次完全相同的异或运算会得到原来的数。a 异或 b 异或 b = a 异或 0 = a

class Solution:def missingNumber(self, nums):missing = len(nums)for i, num in enumerate(nums):missing ^= i ^ numreturn missing
思路四:数学

class Solution:def missingNumber(self, nums):expected_sum = len(nums)*(len(nums)+1)//2actual_sum = sum(nums)return expected_sum - actual_sum
