您的位置:首页 > 编程语言 > Python开发

从整数数组中找出唯二奇数次的数字 Python版

2017-12-22 23:16 309 查看
题目

给定一个数组,数据都是整数,其中只有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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 位运算
相关文章推荐