【异或运算】寻找数组中出现奇数次的1个或两个值

这篇博客介绍了如何利用异或运算性质解决两类问题:1. 在一个整数数组中找到唯一出现奇数次的数值;2. 找到两个出现奇数次的数值并按升序返回。通过逐个与0异或,得到这两个数值的异或结果,再通过特定位运算找到这两个数。
摘要由CSDN通过智能技术生成

题目1

给定一个整数数组local,已知数组中只有一个数出现了奇数次,其他数都出现了偶数次,找出这个出现奇数次的数。

解析

此题用到异或的性质:n^n = 0;n^0 = n;并且异或操作满足交换律和结合律。

令e  = 0,让e逐个对数组中的值做异或,最后结果值即为该出现奇数次的值.

如local = {A,B,C,A,B,N,C},令e ^ A^B^C^A^B^N^C = 0^(A^A)^(B^B)^(C^C)^N = N;

代码实现

class OddAppearance {
public:
    int findOdd(vector<int> A, int n) {
        // write code here
        int e = 0;
        for(int i  = 0;i<n;i++){
            e = e^A[i];
        }
        return e;
    }
};

题目2

给定一个整数数组local,已知数组中只有两个数出现了奇数次, 其他数都出现了偶数次,找出出现奇数次的两个数,并按照从小到大的顺序返回。

解析

假设数组中两个出现奇数次的值为a和b,按照上题只有一个数出现奇数次的思路,令e = 0,让e逐个对数组中的值做异或,最后

e = a^b;

现在的问题是如何识别出a和b。

因为a和b不同,则e 必定不为0,那么e一定有一个位是1 ,并且这个位上a和b只有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值