C++从零开始(day23)——日常刷题6

本文分享了一个C++编程问题,如何在常量空间和线性时间复杂度下找出整数数组中只出现一次的两个数字,通过位运算实现高效解法。作者是初学者,期待读者指正和交流。
摘要由CSDN通过智能技术生成

这是关于一个普通双非本科大一学生的C++的学习记录贴

在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料

那么开启正题

今天分享的是关于vector的题目

1.只出现一次的数字3

260. 只出现一次的数字 III

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题

这个题目的解决方案其实很多,可以遍历,枚举等,但是考虑时间复杂度和空间复杂度就有点难度了,后面学习哈希表可以再尝试一下,目前最好的解决方案就是位运算处理

首先遍历整个顺序表把所有元素异或得到的就是那两个数字的异或结果,再根据这个数判断两个数是从哪一位开始不一样,根据这个来进行“分组”,分组完成后就可以用我们前面的方法来解决了

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) 
    {
        vector<int> ret;
        int val = 0;
        int n1 = 0,n2 = 0;
        int i=0;
        for(i=0;i<nums.size();i++)
        {
            val ^= nums[i];
        }

        int k = 0;
        while(1)
        {
            if(val & (1 << k))
            {
                break;
            }
            k++;
        }

        for(i=0;i<nums.size();i++)
        {
            if(nums[i] & (1 << k))
            {
                n1 ^= nums[i];
            }
            else
            {
                n2 ^= nums[i];
            }
        }

        ret.push_back(n1);
        ret.push_back(n2);

        return ret;
    }
};

这是ac代码

新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值