Leetcode刷题日记三(面试题56 - II. 数组中数字出现的次数 II)经典寻找“单身狗”题目

目录

解题思路

解题方法一

证明

代码一  e&-e的作用

代码二  e&e-1的作用

算法二

分析代码

证明算法


 

 

相信大家都会找简单的“单身狗”,那么三个人一起的话要怎么找单身狗呢 ?

解题思路

我们非从二进制的位去进行分析,对于非单身狗的数,某个二进制为1的话,这个1一定是成三倍出现的,那么某个二进制位的个数膜三余一的话就代表着这个1为单身狗所拥有,我们只需要进行重现记录1的个数然后重现即可

解题方法一

我们先对每一个数的二进制1记录在数组digit中,然后在进行重现

class Solution {
public:
    int singleNumber(vector<int>& nums)
    {
        vector<int>digit(32);   //记录位
        for (auto e : nums)
        {
            while (e)
            {
                int num = e & -e;   //找到num中最低位的1
                int i = log(num) / log(2); //取对数确定位置
                digit[i]++;           
                e &= e - 1;    //消去这个1
            }
        }
        int ans = 0;
        for (int i = 0; i < 32; i++)
        {
            if (digit[i] % 3)
            {
                ans ^= 1 << i;         //数据重现
            }
        }

        return ans;
    }
};

证明

评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

build小春宝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值