题目
在一个无序数组中有99个不重复的正整数,范围为1到100,唯独缺少1个1到100中的整数,如何找到缺失的整数
思路: sum(100)-sum(99)
拓展一: 一个无序数组里有若干正整数,范围1到100, 其中99个整数出现了偶数次,只有一个正整数出现了奇数次,如何找到这个奇数次的整数?
思路:每次出现数字,或二进制问题的时候,脑子里要有一个弦,异或xor
异或的特点是:不同为1,相同为0,所以一个数异或自身为0.
a xor b xor b = a
异或在java语言中也常用来 不借助第三方变量来交换两个数的值
以上为发散思维扩展
对于本题,将所有数异或,得到的结果就是这个奇次整数
拓展二: 一个无序数组里有若干正整数,范围1到100, 其中98个整数出现了偶数次,只有2个正整数出现了奇数次,如何找到这两个奇数次的整数?
所有数异或, 结果必不为0, 根据异或结果, 根据结果的某一位上的1, 和原数组所有数做 异或,将所有数分为ab两组, 则 两个奇数次的整数必然分别分在了ab组中,然后ab两组中的数再分别异或就好.
附上python代码:
def find_lost_num(array=[]):
result = [0, 0]
xor_res = 0
for i in range(0, len(array)):
xor_res ^= array[i]
# 如果异或结果为0,说明array不合要求
if not xor_res:
raise ValueError
# 确定两个整数的不同位,以此来做分组
sep = 1
while not xor_res & sep:
sep <<= 1
# 分两组 异或
for i in range(0, len(array)):
if array[i] & sep:
result[0] ^= array[i]
else:
result[1] ^= array[i]
return result
myarray = [1, 2, 3, 4, 5, 5, 4, 2]
print(find_lost_num(myarray))
拓展三: 如果是三个奇数次整数呢?
有前边两个铺垫,想必大家一定能举一反三了,有兴趣的可以在评论区和我交流探讨