题目描述
- 给定一个包含0,1,2,…,n中n个数的序列,找出0,…,n中没有出现在序列中的那个数。
- 实例1:
输入:[3,0,1]
输出:2
- 实例2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
说明:
你的算法应该具有线性时间复杂度。你能否仅使用额外的常数空间来实现?
- 算法设计与分析:
- 三种方法:
- 1、求出一个列表的长度->mid=(长度*长度+1)//2 ->mid-列表的元素之和–>得到没有出现的值
- 2、完整数列的和-nums中数字的和(题目给出的数字有序的条件下)
- 3、先将传入的列表排序,然后计算列表的长度,使用for的方式进行迭代。一个个比较没返回不存在的数字即可。注意python 的迭代方式最后是迭代完成所有的元素之后就完事了,但是这样并不能查找到后面的元素,所以,需要在后面加上j += 1,来控制数值往后读取下一个
- 使用Python3的三种方法实现:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
# 利害:总结出一个规律:
# 方法一:求出一个列表的长度->mid=(长度*(长度+1))//2 ->mid-列表的元素之和-->得到没有出现的值
# return 0 if nums ==[] else ((len(nums) * (len(nums) + 1))//2) - sum(nums)
# # 方法二:完整数列的和-nums中数字的和(题目给出的数字有序的条件下)
# sum_all = 0
# for i in range(len(nums)+1):
# sum_all += i
# # 使用内置的函数sum()
# sum_num = sum(nums)
# return sum_all - sum_num
# 方法三:将列表的值拍完序之后,逐个对比:注意python里面的sorted()方法是需要加ed的不同于c++的sort()
nums = sorted(nums)
nums_len = len(nums)
# j是在完整的列表里面的,最后返回j=0的情况就是nums=[],空值就是返回0,range(0,2)=[0,1]
j = 0
for j in range(0, nums_len):
if nums[j] != j:
return j
j = j+1 # 模拟C++中的for循环的最后的j++,否则的换python的for是不会尝试往后找的,它负责迭代完成就完事
return j