总结:
方法一,我采用的数组哈希是因为他正好在这方面有其特质
可以采用字典,但是时间上会高一点
异或运算,相同为0,不同为1
排序:大炮打蚊子
数学:关注其思想
这个题目的数学并不难想
高中的时候我们就知道,等差数列求和
没什么好说的
def fun1(nums):
'''
简简单单写循环
:param nums:
:return:
'''
n=len(nums)
shuzu=[-1]*(n+1)#应该有n+1个数字
for i in nums:
shuzu[i]=i
for i in range(len(shuzu)):
if shuzu[i]==-1:
return i
异或运算,常用于数字的查找
def fun2(nums):
'''
进阶:
使用线性时间复杂度和额外的常数空间
说实话,我一看到这直觉告诉我,位运算,然后再想一下
异或运算
怎么说? 放在CSDN里面了
对于异或运算
相同为0 不同为1
0与任何做异或等于该数本身
所以拿两个数就好了
:param nums:
:return:
'''
n=len(nums)
eor=0
for i in range(n+1):
eor^=i
for i in nums:
eor^=i
return eor
排序方法
大炮打蚊子
def fun3(nums):
'''
排序方法,说实话也能做
就是有一种大炮打蚊子的感觉
相应的冗余操作过多
:param nums:
:return:
'''
数学方法,多关注其思想
def fun4(nums):
'''
数学方法,这个就是我想要学习的思想
在这个题目中,可以确定的是
n(n+1)//2,这是正常不缺数的时候
对nums进行遍历,这是缺数情况
两者相减
:param nums:
:return:
'''
n=len(nums)
sum_1=0
for i in nums:
sum_1+=i
sum_2=n*(n+1)//2
return sum_2-sum_1