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

来源:互联网 发布:ubuntu命令行升级系统 编辑:程序博客网 时间:2024/05/17 04:33

题目
给定一个数组,数据都是整数,其中只有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)
阅读全文
0 0
原创粉丝点击