news 2026/8/4 3:51:58

C++算法之位运算(十分钟带你速通)上

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++算法之位运算(十分钟带你速通)上

位运算基础

&运算:有0就是0

示例:

|运算:有1就是1

示例:

^运算:相同为0,相异为1

示例:

后面学到其它位运算再补!

面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

解法一:使用哈希表思路

1、0~26的小写字母(所以我们开25空间的哈希表数组)

2、扫描一次字符串,当出现第一次就++,再继续扫描,如果同样的也就是++,我们可以特判,此时大于1就是重复了,直接false,否则继续扫描,扫描完没有重复就true

class Solution { public: bool isUnique(string astr) { // 创建一个长度为26的整型数组,用来记录26个小写字母出现的次数 // 下标0对应'a',下标1对应'b',...,下标25对应'z' // 初始值全部为0,表示所有字母都还没出现过 int haxi[26] = {0}; // 遍历字符串中的每一个字符 // i从0开始,到字符串长度-1结束 for (int i = 0; i < astr.size(); i++) { // 计算当前字符对应的数组下标 // 例如:'a'-'a'=0,'b'-'a'=1,'c'-'a'=2 // 这样就能把字母映射到数组的对应位置 int index = astr[i] - 'a'; // 将该字母的出现次数加1 // 第一次出现:0变成1;第二次出现:1变成2 haxi[index]++; // 检查该字母是否已经重复出现 // 如果出现次数大于1,说明之前已经出现过一次了 // 现在又遇到一次,所以字符串中有重复字符 if (haxi[index] > 1) { return false; // 发现重复,直接返回false,结束函数 } } // 如果遍历完整个循环都没有返回false // 说明所有字符都只出现了一次,没有重复 return true; } };

解法二:位图

利用位图思想,每一个比特位代表的是字符,并且int变量里面的32位足够表示所有的小写字母了,当比特位里面如果是0就是没有出现,如果是1就表示出现过了

注意优化:当他的字符串要是27位是不是就表示,他必定有重复的字符串?

class Solution { public: bool isUnique(string astr) { // 优化 if(astr.size()>26)return false; int arr=0; for(auto c : astr) { // 字符转数字 int i = c -'a'; // 取字符是不是1,是1就是出现过 if(((arr>>i) & 1) == 1)return false; // 出现过了,装进去 arr |= 1<<i; } return true; } };

268. 丢失的数字 - 力扣(LeetCode)

这题隐约在牛客周赛刷到过,好像cf也有,年代太久了,那我这次就带大家学一下,自己也复习一遍

方法一:哈希表

开一个哈希表,扫描一下原来的数组,把数组里面的数字映射到哈希表,然后哈希表改成1,最后在扫描一下哈希表,如果是0就是丢失的数字

class Solution { public: int missingNumber(vector<int>& nums) { int haxi[10005] = {0}; for(auto c : nums) { haxi[c]=1; } for(int i=0;i<n;i++) { if(haxi[i]==0) { return i; } } return -1; } };

方法二:高斯求和

把数字的1~n的下标给求和起来,记住一定是下标,最后的值减去数组里面的值就是丢失的数字。

例如:【3,0,1】,下标求和是6,6-3-1=2,那这个不就是丢失的数字吗?

class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int sum = (1+n)*n; int result = sum/2; for(auto c : nums) { result-=c; } return result; };

方法3:位运算(消消乐异或和)

最简单的理解,异或和就是一样的可以消掉

例如:【3,0,1】

【0,1,2,3】

0,1,3是不是消掉了,剩下2?

class Solution { public: int missingNumber(vector<int>& nums) { int ret=0; for(auto c : nums) ret^=c; for(int i=0;i<nums.size()+1;i++) ret^=i; return ret; };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 3:51:21

2026年微信小程序商城开发哪个平台好?SaaS、企业级电商与定制

企业搜索“微信小程序商城开发哪个平台好”&#xff0c;常把SaaS平台、企业级电商系统和定制开发放在同一张清单里。但这些方案面对的业务复杂度、技术团队和维护责任不同&#xff0c;不能只比较功能名称。标准商品、订单、支付、会员和营销可以使用成熟SaaS&#xff1b;需要ER…

作者头像 李华
网站建设 2026/8/4 3:50:46

如何5分钟掌握XXMI启动器:一站式游戏模组管理终极指南

如何5分钟掌握XXMI启动器&#xff1a;一站式游戏模组管理终极指南 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 想要告别多款游戏模组管理的混乱局面吗&#xff1f;XXMI启动器…

作者头像 李华
网站建设 2026/8/4 3:50:40

投资公司部门之间推诿扯皮?北京华恒智信成功案例

【导读】组织结构是企业流程运行的基础&#xff0c;因此该投资公司新上任的总经理着手推进组织架构改进。公司组织结构中常存在某些机构职责界定不清的问题&#xff0c;容易出现职责重叠或覆盖不到的空白区域。针对Q公司的实际情况&#xff0c;华恒智信提出了首创性的"投资…

作者头像 李华
网站建设 2026/8/4 3:49:50

YOLO26涨点改进| CVPR 2026顶会 | 独家注意力改进篇 | 引入 LCAR 轻量级通道注意力门控模块,空间细节保持能力强,有助于处理模糊边界,适合目标检测,医学图像分割任务有效涨点

一、本文介绍 🔥本文给大家介绍使用 LCAR 轻量级通道注意力门控模块 改进YOLO26网络模型,LCAR通过无池化的逐像素、逐通道注意力,根据局部内容自适应增强与目标相关的边缘、纹理和语义通道,同时抑制复杂背景、阴影及冗余特征,从而提升小目标、弱边界和不规则目标的辨识与…

作者头像 李华
网站建设 2026/8/4 3:49:35

移动应用打包全解析:原生与跨平台方案对比与实战选型指南

1. 项目概述&#xff1a;App打包的两种核心路径在移动应用开发领域&#xff0c;无论你是独立开发者还是团队中的一员&#xff0c;最终都需要面对一个关键环节&#xff1a;将你的源代码、资源文件、依赖库等“原材料”变成一个可以在用户设备上安装运行的“成品”。这个过程&…

作者头像 李华
网站建设 2026/8/4 3:48:35

猫抓扩展:浏览器资源嗅探终极指南,轻松捕获任何在线资源

猫抓扩展&#xff1a;浏览器资源嗅探终极指南&#xff0c;轻松捕获任何在线资源 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否遇到过这样的…

作者头像 李华