专注 效率 记忆
预习 笔记 复习 做题
欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!
本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
50天后我们就可以学完76道题,相信50天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:866984458
本题出自 acwing网站
这个系列是免费的
打卡即刻退回费用。
第四十一天【剑指Offer例题代码 系列】
- 61. 数组中只出现一次的两个数字【异或 相同的为0】
- 62. 数组中唯一只出现一次的数字
- 方法一:统计每一位中 1出现的个数
- 方法二:循环
61. 数组中只出现一次的两个数字【异或 相同的为0】
class Solution {
public:
vector<int> findNumsAppearOnce(vector<int>& nums) {
int sum = 0;
for (auto x : nums) sum ^= x;
int k = 0;
while (!(sum >> k & 1)) k ++ ;
int first = 0;
for (auto x : nums)
if (x >> k & 1)
first ^= x;
return vector<int>({first, sum ^ first});
}
};
62. 数组中唯一只出现一次的数字
方法一:统计每一位中 1出现的个数
class Solution {
public:
int findNumberAppearingOnce(vector<int>& nums) {
int ans = 0;
for (int i = 31; i >= 0; --i) {
int cnt = 0;
for (int x: nums) {
if (x >> i & 1) {
cnt ++;
}
}
if (cnt % 3 == 1) {
ans = (ans * 2) + 1;
}
else {
ans = ans * 2;
}
}
return ans;
}
};
方法二:循环
每一位出现的1的次数 要么是 3k 要么是3k+1
那么我们就通过异或
使得3k的1都异或成0
由于数组个数一定是3k+1
那么只要我们让3k异或成0
那么1一定保留
所以我们就让循环规律为3个一循环
class Solution {
public:
int findNumberAppearingOnce(vector<int>& nums) {
int ones = 0, twos = 0;
for (auto x : nums)
{
ones = (ones ^ x) & ~twos;
twos = (twos ^ x) & ~ones;
}
return ones;
}
};