【每日刷题】Day136
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
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};
}
};