📅  最后修改于: 2023-12-03 14:54:59.748000             🧑  作者: Mango
问题描述:给定一个整数数组,其中每个元素都出现了 k 次,只有一个元素出现了一次。找出出现了一次的那个元素。
解决方法:根据位运算的思想,将所有元素的二进制表示的每一位分别相加,得到的结果对 k 取余,最后余数不为 0 的那一位就是出现了一次的那个元素在该位上为 1 的那一位。
代码实现:
def find_unique(nums, k):
# 记录每一位上出现 1 的次数
bit_counts = [0] * 32
for num in nums:
for i in range(32):
bit_counts[i] += num & 1
num >>= 1
# 对每一位上出现次数对 k 取余,得到的余数就是出现一次的那一位
bit_counts = [cnt % k for cnt in bit_counts]
# 将余数组成二进制数,得到出现一次的那个数
res = 0
for i in range(31, -1, -1):
res <<= 1
res |= bit_counts[i]
return res
测试:
assert find_unique([2, 2, 5, 5, 3, 3, 7, 7, 6, 6, 1, 8, 8, 9, 9], 2) == 1
assert find_unique([2, 2, 5, 5, 3, 3, 7, 7, 6, 6, 1, 8, 8, 9, 9, 10, 10, 12, 12, 14, 14, 16], 2) == 1
assert find_unique([1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10], 3) == 10
assert find_unique([1], 5) == 1
时间复杂度:$O(n)$,其中 $n$ 是数组的长度。
空间复杂度:$O(1)$。