在做题中学习(32):只出现一次的数字 III

260. 只出现一次的数字 III - 力扣(LeetCode)

根据题目可知:有两个元素只出现一次,其余出现两次。

而在只出现一次的数字 I 里,只有一个元素出现一次,可以用异或的方式直接得到最后的答案,而此题中最后会得到两个不同数字异或后的值x。(a^b=x)

思路:

**1.**从x中获取第一个lowbit为1的位,因为两个数异或某一位结果为1的话,那么这两个数在这一位上的值必定不相同。

**2.**根据这个不相同,把原数组里的所有数分为两组,分别是 :这一位为0和这一位为1,再定义两个变量a b分别异或一组数,a b最终的结果就是两个只出现一次的元素。

注意:用unsigned是因为小心取lowbit溢出问题。

cpp 复制代码
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) 
    {
        unsigned int j=0;
        //最后异或得到的数字
        for(int i=0;i<nums.size();i++)
        {
            j^=nums[i];
        }
        //k拿到j最低位的1
        unsigned int k=j&(-j);
        //count是几,就是第几位有不同
        int count=0;
        while(k!=1)
        {
             k = k>>1;
             count++;
        }
        int a,b=0;
        //分组异或
        for(int i=0;i<nums.size();i++)
        {
            if(((nums[i]>>count)&1)==0)
            {
                a^=nums[i];
            }
            else
            {
                b^=nums[i];
            }
        }
        vector<int> v3;
        v3.push_back(a);
        v3.push_back(b);
        return v3;
    }
};
相关推荐
楚山之石12 小时前
【Nat Biomed Eng】Connectome 2.0 超高梯度扫描仪:500 mT/m 与 600 T/m/s 把活体人脑微观结构分辨推进到亚微米级
图像处理·学习·数据分析·mri
坤坤子吖14 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
码客-ygluu15 小时前
一个通用游戏数据服务器
c++·架构
another heaven15 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude15 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司16 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP18 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
LGL6030A18 小时前
Java学习历程31——初识Spring Boot
java·spring boot·学习
xiaoye-duck18 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型