【C++】力扣OJ题:找出只出现一次的数字

Hello everybody!这是我第一次写关于OJ题目的博客,因为正好学到完了C++的STL库,就顺手刷了一些OJ题。

我今天要介绍的题目虽然是力扣上的简单题,但思想很巧妙,我觉得有必要和大家分享一下!

1.题目

2.代码

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int val=0;
        for(auto e:nums){
            val^=e;//相同的数异或结果为0
        }
        return val;
    }
};

3.提交结果

4.讲解

题目很短,相信大家可以轻松读懂,方法也有很多种,我给出了我认为的最优解。

代码虽然很短,但读懂它还是不太容易的。

核心代码是:val^=e。这行代码等价于val=val^e。

为什么val从刚开始的0逐一于nums中的数据按位异或一次就得到答案了呢?

其实这是一个累积的过程,我们要知道:

  1. 0和任何数异或都等于任何数。
  2. 而任意两个相同的数异或都等于0。

0和nums中第一个数异或得到第一个数,在接下来的累积异或的过程中,相同的数都被抵消掉了,最后剩下的那个一定是只出现了奇数次的数字。题目要求找出只出现一次的数字,一次也是奇数次,咱们的思路是符合题意的!

大家可以自己举一个例子,一试便知!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

崽崽..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值