在其他数都出现偶数次的数组中找到出现奇数次的数

在其他数都出现偶数次的数组中找到出现奇数次的数

整型数组中其他数都出现偶数次找到唯一出现奇数次的数

题目

给定一个整型数组arr,其中只有一个数出现了奇数次,其他的数都出现了偶数次,
打印这个数。


算法思路

a ^ a = 0
a ^ 0 = a
偶数次异或为0奇数次异或为本身
遍历数组异或结果即为唯一出现奇数次的数

注意
异或运算满足交换律,因此异或结果跟数组中数的出现顺序无关。

相应代码
# 其他数出现偶数次,有一个数出现奇数次
def print_one_odd_times_number(arr):
    res = 0
    for num in arr:
        res ^= num
    print(res)

整型数组中其他数都出现偶数次找到两个出现奇数次的数

题目

有两个数出现了奇数次,其他的数都出现了偶数次,打印这两个数。


算法思路

若有两个出现奇数次的数,则遍历数组异或结果为二者异或结果res = a1 ^ a2
获取结果最右边的1(在该位置必定一个数为0,一个数为1,因为0^1=1),以此为标准筛选数组中的值进行异或,可得到两者中的一个数,假定为a1
则 a2 = res ^ a1 = a1 ^ a2 ^ a1 = a2 ^ (a1 ^ a1) = a2 ^ 0 = a2


相应代码
# 其他数出现偶数次,有两个数出现奇数次
def print_two_odd_times_numbers(arr):
    res = 0
    # a1 ^ a2
    for num in arr:
        res ^= num
    right_one = res ^ (~res + 1)  # 最右边的1
    a1 = 0
    for num in arr:
        if num ^ (~num + 1) == right_one:
            a1 ^= num
    a2 = res ^ a1
    print(a1, a2)

有任何疑问和建议,欢迎在评论区留言和指正!

感谢您所花费的时间与精力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值