题目描述:
给定一个由 n-1 个整数组成的未排序的数组序列,其元素都是 1 到 n 中的不同的整数。构造一个寻找数组序列中缺失整数的线性时间算法。
方法:
- 累加求和
- 异或法
1.累加求和
定义两个数 suma,sumb,其中,suma表示的是这 n-1 个数的和,sumb表示的是这 n 个数的和,显然缺失的数字的值即为 sumb-suma的值。
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/27 17:13
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
def getNum(arr):
if arr == None or len(arr) < 0:
print('参数不合理!')
return -1
suma = 0
sumb = 0
i = 0
while i < len(arr):
suma += arr[i] # 数组的和
sumb += i
i += 1
sumb = sumb + len(arr) + len(arr) + 1
return sumb - suma
if __name__ == '__main__':
arr = [1, 4, 3, 2, 7, 5]
print('result1:', getNum(arr))
结果:
算法性能分析:
时间复杂度为O(n);
注意防止溢出。
2.异或法
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/27 17:23
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
def getNum(arr):
if arr == None or len(arr) <= 0:
print('参数不合理!')
return
a = arr[0]
lens = len(arr)
i = 1
while i < len(arr):
a ^= arr[i]
i+=1
for j in range(1, lens + 2):
a ^= j
return a
if __name__ == '__main__':
arr = [1, 4, 3, 2, 7, 5]
print('result2:', getNum(arr))
结果:
算法性能分析:
时间复杂度为O(n)
end