题目:
给定一个数组,数据都是整数,其中只有2个数字出现了奇数次,其它都是偶数次。找出那2个奇数次的数字。
要求:
时间复杂度o(n),空间复杂度为o(1)。
分析:
如果有两个数字出现了奇数次,比如是 a 和 b,则最终 odd 结果为 a^b,但其中一定有差别。因为数字不一样,所以其异或结果一定不是0,那么也就是其中有一位是1,不论哪一位是1,把数组中所有的那一位是1的数字全部异或,结果就是其中一个出现了奇数次的那个数,再和odd异或,得到另一个数字。
代码:
def print_odd_times_num2(arr):
odd, odd_one = 0, 0
for i in arr:
odd ^= i
right = odd & (~odd + 1) # odd的第k位是1,即两个奇数个的数字的第k位一定不同,这里也是个骚操作,它找出了数字最右边的那个1
for i in arr:
if i & right != 0:
odd_one ^= i
return odd_one, odd_one ^ odd
总结一下,一种位运算操作是:
odd & (~odd + 1)
另一种是
a & (a - 1)