【每日刷题】Day136

【每日刷题】Day136

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 371. 两整数之和 - 力扣(LeetCode)

2. LCR 004. 只出现一次的数字 II - 力扣(LeetCode)

3. 面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

1. 371. 两整数之和 - 力扣(LeetCode)

//思路:位运算。

class Solution {

public:

    int getSum(int a, int b)

    {

        int ret1 = a^b;

        int ret2 = (a&b)<<1;

        while(ret2)//重复操作,直到 (a&b)<<1 == 0

        {

            int tmp1 = ret1;

            ret1 = ret1^ret2;

            ret2 = (tmp1&ret2)<<1;

        }

        return ret1;

    }

};

2. LCR 004. 只出现一次的数字 II - 力扣(LeetCode)

//思路:或运算

class Solution {

public:

    int singleNumber(vector<int>& nums)

    {

        int ans = 0;

        for(int i = 0;i<32;i++)//遍历每一个数字的每一位

        {

            int sum = 0;

            for(auto x:nums)

                if(((x>>i)&1)) sum++;//如果当前位为1,记录当前位总和

            sum%=3;//当前位总和 %= 3

            if(sum) ans|=1<<i;//修改结果当前位

        }

        return ans;

    }

};

3. 面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

//思路:位运算

//本题的思路是将 "丢失的数字" 和 "只出现一次的数字Ⅲ" 两道题的思路结合。

class Solution {

public:

    vector<int> missingTwo(vector<int>& nums)

    {

        int tmp = 0;

        for(auto i:nums) tmp^=i;

        for(int i = 1;i<=nums.size()+2;i++) tmp^=i;//此时 tmp 就是两个答案的异或,我们需要将两个答案分别找到

        int diff = 0;

        while(1)

        {

            if((tmp>>diff)&1) break;//确定 tmp 中为 1 的位

            else diff++;

        }

//根据这个位将所有数字分为两个部分,ans1、ans2分别异或上这两个部分的所有数字,最终留下来的就是答案

        int ans1 = 0,ans2 = 0;

        for(auto i:nums)

            if(((i>>diff)&1)) ans2^=i;

            else ans1^=i;

        for(int i = 1;i<=nums.size()+2;i++)

            if(((i>>diff)&1)) ans2^=i;

            else ans1^=i;

        return {ans1,ans2};

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值