📅  最后修改于: 2023-12-03 15:41:09.557000             🧑  作者: Mango
我们有一个长度为n的数组A,其中有一个数不止出现一次。请写一个算法,在O(n)的时间复杂度,O(1)的额外空间复杂度下,找到这个数。
我们可以利用异或运算的性质来解决这个问题。异或运算的性质是:对于任意的两个数x和y,x^y^y=x,x^y^x=y。
我们从头到尾遍历数组A,对每一个数进行异或运算。如果一个数只出现一次,那么它就会在异或运算中把自己加进去,再把自己异或掉,最终结果一定是0。如果一个数出现多次,那么它的每一次出现都会被计算到,最终的结果就是这个数本身。
我们把数组A所有的数都进行异或运算,最终得到的结果就是我们要查找的那个数。
def find_duplicate(A):
res = 0
for num in A:
res ^= num
return res
遍历数组A的时间复杂度是O(n),每一次异或运算只需要常数时间,因此总时间复杂度为O(n)。
我们只声明了一个常数空间的变量res,因此空间复杂度为O(1)。
输入一个长度为n的数组A,输出A中的不止出现一次的数。
A = [1, 2, 3, 4, 2, 5, 1]
find_duplicate(A) # 返回2