【优选算法必刷100题:专题五】(位运算算法)第033~38题:判断字符是否唯一、丢失的数字、两整数之和、只出现一次的数字 II、消失的两个数字

【优选算法必刷100题:专题五】(位运算算法)第033~38题:判断字符是否唯一、丢失的数字、两整数之和、只出现一次的数字 II、消失的两个数字

在这里插入图片描述


🎬 个人主页艾莉丝努力练剑
专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录
Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享

⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平


🎬 艾莉丝的简介:

在这里插入图片描述

🎬艾莉丝的算法专栏简介:

在这里插入图片描述

文章目录


在这里插入图片描述

常见位运算总结

1 ~> 刷前必刷题单

干掉一个数(n)二进制表示中最右侧的1:
classSolution{public:inthammingWeight(int n){int count =0;while(n){ n &=(n -1); count++;}return count;}};
// 奇偶性动态规划// class Solution {// public:// vector<int> countBits(int n) {// vector<int> ans(n + 1,0);// for(int i = 1;i < n + 1;i++)// {// ans[i] = ans[i >> 1] + (i & 1);// }// return ans;// }// };// 汉明重量问题解法classSolution{public: vector<int>countBits(int n){ vector<int>ans(n +1);for(int i =1;i < n +1;i++){int count =0;int nums = i;while(nums){ nums &=(nums -1); count++;} ans[i]= count;}return ans;}};
// 干掉一个数二进制位中表示最右侧的1classSolution{public:inthammingDistance(int x,int y){int val = x ^ y;int count =0;while(val){ val &=(val -1); count++;}return count;}};
异或(^)运算的运算律相关的算法题:
classSolution{public:intsingleNumber(vector<int>& nums){int result =0;int i =0;while(i < nums.size()){ result ^= nums[i]; i++;}return result;}};
classSolution{public: vector<int>singleNumber(vector<int>& nums){ vector<int>ans(2,0);int result =0;int i =0;while(i < nums.size()){ result ^= nums[i]; i++;}unsignedint val = result &(-(unsignedint)result); i =0;// 重置iwhile(i < nums.size()){if(nums[i]& val){ ans[0]^= nums[i];}else{ ans[1]^= nums[i];} i++;}return ans;}};

2 ~> 博主手记

在这里插入图片描述
在这里插入图片描述

033 判断字符是否唯一

力扣链接:面试题 01.01. 判定字符是否唯一

题目描述:

在这里插入图片描述

​1.1 解法(位图的思想):

利用「位图」的思想,每一个【比特位】代表一个【字符】,一个int类型的变量的32位足够表示所有的小写字母。比特位里面如果是0,表示这个字符没有出现过。比特位里面的值是1,表示该字符出现过。

那么我们就可以用一个【整数】来充当【哈希表】。

1.2 算法实现

classSolution{public:boolisUnique(string astr){// 利用鸽巢原理做优化if(astr.size()>26)returnfalse;// 搞定位图int bitMap =0;// 遍历字符串for(auto ch : astr){int i = ch -'a';// 先把重复的字符处理一下if((bitMap >> i)&1==1)returnfalse;// 说明字符没有出现过,添加到位图中 bitMap |=1<< i;}returntrue;}};

1.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

034 丢失的数字

力扣链接:268. 丢失的数字

题目描述:

在这里插入图片描述

2.1 解法:位运算

设数组的大小为n,那么缺失之前的数就是[0 , n],数组中是在[0,n]中缺失一个数形成的序列。

如果我们把数组中的所有数,以及[0 , n]中的所有数全部【异或】在一起,那么根据【异或】运算的【消消乐】规律,最终的异或结果应该就是缺失的数。

2.2 算法实现

classSolution{public:intmissingNumber(vector<int>& nums){// 用ret表示确实的那个数字int ret =0;// 把数组中的数异或在一起for(auto x : nums) ret ^= x;// 把0~n中的数异或在一起for(int i =0;i <= nums.size();i++) ret ^= i;return ret;}};
在这里插入图片描述

2.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

035 两整数之和

力扣链接:371. 两整数之和

题目描述:

在这里插入图片描述

3.1 位运算解法的算法思路

  • 异或^运算本质是【无进位加法】;
  • 按位与&操作能够得到【进位】;
  • 然后一直循环进行,直到【进位】变成0为止。

3.2 算法实现

classSolution{public:intgetSum(int a,int b){while(b !=0)// 一直重复这个操作{int x = a ^ b;// 先算出无进位相加的结果unsignedint carry =(unsignedint)(a & b)<<1;// 算出算出进位// 这里用unsigned int是考虑到a & b如果是-1的话,此时左移操作是没有定义的,用这种方式处理一下-1的情况(把-1当成无符号的整数) a = x;// 把无进位相加结果给a b = carry;// 把进位相加结果给b}return a;}};
在这里插入图片描述
笔试场上可以不讲武德,面试官不看,而且代码也是会通过的:
classSolution{public:intgetSum(int a,int b){return a + b;}};

3.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

036 只出现一次的数字 II

力扣链接:137. 只出现一次的数字 II

题目描述:

在这里插入图片描述

4.1 解法思路:比特位计数

设要找的数位ret

由于整个数组中,需要找的元素只出现了【一次】,其余的数都出现的【三次】,因此我们可以根据所有数的【某一个比特位】的总和%3的结果,快速定位到ret的【一个比特位上】的值是0还是1。

这样,我们通过ret的每一个比特位上的值,就可以将ret给还原出来。

4.2 算法实现

classSolution{public:intsingleNumber(vector<int>& nums){int ret =0;for(int i =0;i <32;i++)// 依次去修改 ret 中的每一位{int sum =0;for(int x : nums)// 计算 nums 中所有的数的第 i 位的和if(((x >> i)&1)==1) sum++; sum %=3;if(sum ==1) ret |=(1<< i);}return ret;}};
在这里插入图片描述

4.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

037 消失的两个数字

力扣链接:面试题 17.19. 消失的两个数字

题目描述:

在这里插入图片描述

5.1 解法:位运算

本题就是268. 丢失的数字 + 260. 只出现一次的数字 III组合起来的题。

先将数组中的数和[1 , n + 2]区间内的所有数【异或】在一起,问题就变成了:有两个数出现了【一次】,其余所有的数出现了【两次】。进而变成了260. 只出现一次的数字 III这道题。

5.2 算法实现

classSolution{public: vector<int>missingTwo(vector<int>& nums){// 1、将所有的数异或在一起int tmp =0;for(auto x : nums) tmp ^= x;// 异或原数组中的数// 异或1 ~ Nfor(int i =1;i <= nums.size()+2;i++) tmp ^= i;// 2、找出a,b中比特位不同的那一位int diff =0;while(1){if(((tmp >> diff)&1)==1)break;else diff++;}// 3、根据diff位的不同,将所有的数划分为两类来异或int a =0,b =0;for(int x : nums)if(((x >> diff)&1)==1) b ^= x;else a ^= x;for(int i =1;i <= nums.size()+2;i++)if(((i >> diff)&1)==1) b ^= i;else a ^= i;return{a,b};}};
在这里插入图片描述

5.3 博主手记

本题整个的思路、算法原理、解题过程博主在纸上推导了一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己能够推导很重要!
在这里插入图片描述

结尾

uu们,本文的内容到这里就全部结束了,艾莉丝再次感谢您的阅读!

结语:希望对学习算法相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!

往期回顾:

【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和

🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡૮₍ ˶ ˊ ᴥ ˋ˶₎ა

Read more

OpenClaw 刚配好就完了?5 步调教,让你的 AI 助手真正“能干活”

OpenClaw 刚配好就完了?5 步调教,让你的 AI 助手真正“能干活”

很多人装完 OpenClaw,接上 Discord 或 Telegram,发现能聊天了就觉得“搞定了”。 但我自己踩坑一圈后,越来越确定一件事:默认状态的 OpenClaw,可能只发挥了 20% 的能力。剩下的 80%,藏在一些你没太注意的配置文件里——而且改起来并不难。 下面我按“收益从高到低”的顺序,把我自己最有效的 5 步调教方法整理出来。新手照着做,大概率能立刻感受到差别。 默认状态 vs 调教后:差别到底在哪? 先给你一个直观对比,方便建立预期: 项目默认状态调教后回复风格客服味:“我很乐意帮助您!”更像懂你的搭档记忆每次对话都像陌生人记得你们之前聊过什么能力只能聊天能下载视频、查股票、做 PPT、巡检服务器…主动性你不说它不动会定期检查状态,主动提醒成本/效率所有任务都用同一个模型复杂任务用强模型,简单活用便宜模型 如果你只做一件事:先把第 1 步和第 2 步做了,

By Ne0inhk
AI中的Skills详解

AI中的Skills详解

在AI领域中,Skills指的是将特定任务的方法论、执行逻辑与资源封装成模块化单元,使AI能够像人类一样按流程稳定执行复杂任务。其核心在于将零散的工具(如函数调用)整合为完整的工作流,突破传统提示词(Prompt)的能力边界。以下是关于AI中Skills的详细解析: 一、Skills的定义与核心机制 1. 定义:Skills是将特定任务的方法论、执行逻辑与资源封装成模块化单元,使AI能够按照预设流程执行复杂任务。它类似于人类的“技能”,即执行某件事的方法论。 2. 核心机制:Skills采用“渐进式披露”(Progressive Disclosure)机制,通过分层加载信息,确保AI在需要时获取所需知识,同时最大化利用上下文效率。这种机制避免了信息过载,提高了AI的处理速度和准确性。 二、Skills的组成与特点 1. 组成: * 元数据(Metadata):包含对技能的简短描述,保存在全局上下文中,体积小,节省Tokens。 * 行动指南(Action Guide):规定AI每一步该怎么做,是真正的提示词部分。 * 资源文件(Resources)

By Ne0inhk
AGI之AI-Assistant之MultiAgent之OpenClaw:IronClaw的简介、安装和使用方法、案例应用之详细攻略

AGI之AI-Assistant之MultiAgent之OpenClaw:IronClaw的简介、安装和使用方法、案例应用之详细攻略

AGI之AI-Assistant之MultiAgent之OpenClaw:IronClaw的简介、安装和使用方法、案例应用之详细攻略 目录 IronClaw简介 1、特点 IronClaw的安装与使用方法 1、安装 先决条件 下载或构建 配置(Setup / onboard) 2、使用方法 常用运行命令(示例) 通道与插件安装(举例:Telegram) 开发 / 测试(本地) IronClaw的案例应用 1) 作为个人/团队的“离线/可控”智能助理 2) 聊天通道:Telegram(实战) 3) 自动化与后台任务(Routines / Webhooks) 4) 开发自定义工具(WASM)与集成 IronClaw简介 IronClaw 是一个以隐私与安全为核心的“个人 AI

By Ne0inhk

我和 AI 聊了一晚上,第二天它说“你好,请问有什么可以帮你?“凌晨我的 AI 尽然悄悄把记忆清空了!——OpenClaw Session 完全生存指南:重置、压缩、剪枝、记忆一网打尽

凌晨4点,我的 AI 悄悄把记忆清空了——OpenClaw Session 避坑指南 摘要:用 OpenClaw 搭了个 AI 助手,聊得好的,第二天一早它就"失忆"了?本文从一个真实踩坑出发,系统拆解 OpenClaw 的 Session 机制——重置(Reset)、压缩(Compaction)、剪枝(Pruning)、记忆(Memory)、会话控制(Session Tool)——帮你彻底搞懂"对话为什么会消失"以及"怎么让 AI 记住你"。 🤯 踩坑现场 事情是这样的: 我用 OpenClaw

By Ne0inhk