# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第4章 数组 4.4 如何找出数组中丢失的数
题目:
给定一个由n-1个整数组成的未排序的数组序列,其元素都是1到n中的不同的整数。
请写出一个寻找数组序列中缺失整数的线性时间算法。
分析:
假设n为6,数组为[1,5,2,4,6]。
方法1: 暴力破解就是计算1到n的整数和然后减去数组和,不过这样如果数组很大,可能导致溢出
问题。
方法2: 能不能仿效之前异或求解唯一重复元素的方法来做。
求出1~n的异或结果,然后求出整个数组异或的结果,两个异或结果再异或一下,
即可。
最简单的例子,假设n为3,给定数组为[1,2]
那么1,2,3的异或结果result1=1^2^3=0001^0010^0011=0011^0011=0000
那么1,2的异或结果result2=1^2=0001^0010=0011
result1和result2的异或结果=0000^0011=0011=3
就这样做。
关键:
1 寻找重复/丢失的数字一定要首先考虑异或方法
参考:
Python程序员面试算法宝典
'''
def findMissingNumber(data, n):
if not data:
return
if n < 1:
return
result1 = 0
for value in data:
result1 ^= value
result2 = 0
for value in range(1, n+1):
result2 ^= value
result = result1^result2
return result
def process():
data = [1, 2]
n = 3
result = findMissingNumber(data, n)
assert result == 3
data = [1,5,2,4,6]
n = 6
result = findMissingNumber(data, n)
assert result == 3
if __name__ == "__main__":
process()