在做题中学习(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;
    }
};
相关推荐
zhangrelay7 分钟前
机械臂末端规划智能模型的误区演示
linux·笔记·学习·ubuntu·ros2
朝朝辞暮i1 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
青梅橘子皮1 小时前
Blue---二分算法(二分查找与二分答案)
算法
长河1 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
月光船幽幽2 小时前
加性偏移外推提升参数识别可靠性
python·算法
织码weavecodes2 小时前
培训平台部署备份与容灾:从三服务交付到可恢复运行
大数据·学习·开源软件
SHARK_pssm2 小时前
【C++——类和对象(下)】
开发语言·c++·经验分享·笔记
汉克老师2 小时前
GESP2026年9月认证C++二级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
Ivanqhz2 小时前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
沫璃染墨3 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构