Leetcode典型题解答和分析、归纳和汇总——T137(只出现一次的数字II)

本文深入探讨了在一个除一个元素外所有元素均出现三次的数组中,如何利用位运算技巧找到仅出现一次的元素。通过统计二进制位中1的个数并对其取模,巧妙地解决了这一问题。此方法不仅适用于当前场景,还可推广至更广泛的n个重复元素的查找场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

问题分析:

这个题目与上个只出现一次的元素具有异曲同工之妙,上一题是其他所有元素都出现两次,我们可以用所有元素进行异或,因为只要是两个相同的元素,经过异或之后,两数相减,就会变成0,否则就是进行相加。

本题同样我们仍然采用位运算,我们先将所有十进制的数看成是二进制数(假设最长为32位),然后统计出所有二进制数字中从0位到第32位中1的个数,记作:sum,然后将sum对3取余得到结果tmp,剩下的这个结果tmp就是该位上需要保存的结果值。

注意:这个方法可以推广到n个相同元素找出唯一只出现一次的那个元素情况!!!

程序代码如下:

class Solution{
    public:
    int singleNumber(vector<int>& nums)
    {
       int res=0;

       for(int i=0;i<32;i++)
       {
           int sum = 0;
           for(int j=0;j<nums.size();j++)
           {
               sum+=(nums[j]>>i)&1;
           }

           res^= (sum%3)<<i;
       }

       return res;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值