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

题目
给定一个数组,数据都是整数,其中只有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)

猜你喜欢

转载自blog.csdn.net/dongrixinyu/article/details/78877546