在做题中学习(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;
    }
};
相关推荐
AI科技星几秒前
圆柱螺旋运动方程的一步步求导与实验数据验证
开发语言·数据结构·经验分享·线性代数·算法·数学建模
FONE_Platform20 分钟前
FONE食品饮料行业全面预算解决方案:构建韧性增长
人工智能·算法·全面预算·全面预算管理系统·企业全面预算
月明长歌30 分钟前
【码道初阶】【Leetcode94&144&145】二叉树的前中后序遍历(非递归版):显式调用栈的优雅实现
java·数据结构·windows·算法·leetcode·二叉树
HyperAI超神经37 分钟前
【vLLM 学习】Prefix Caching
人工智能·深度学习·学习·大语言模型·cpu·gpu·vllm
DanyHope1 小时前
《LeetCode 49. 字母异位词分组:哈希表 + 排序 全解析》
算法·leetcode·哈希算法·散列表
iAkuya1 小时前
(leetcode) 力扣100 15轮转数组(环状替代)
数据结构·算法·leetcode
杰克尼1 小时前
蓝桥云课-5. 花灯调整【算法赛】
java·开发语言·算法
.小墨迹1 小时前
C++学习之std::move 的用法与优缺点分析
linux·开发语言·c++·学习·算法·ubuntu
努力学算法的蒟蒻1 小时前
day38(12.19)——leetcode面试经典150
算法·leetcode·面试
看见繁华1 小时前
C++ 设计模式&设计原则
java·c++·设计模式