优选算法——位运算


👇作者其它专栏

《数据结构与算法》《算法》《C++起始之路》


1.前要知识

《位操作符的妙用》

2.相关题解

2.1判定字符是否唯一

算法思路:

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

可以用一个【整数】来充当【哈希表】。

class Solution { public: bool isUnique(string astr) { //利用鸽巢原理优化 if(astr.size()>26) return false; int bitmap=0; for(auto i:astr){ int e=i-'a'; //先判断字符是否出现过 if(((bitmap>>e)&1)==1) return false; //把当前字符加入到位图中 bitmap|=1<<e; } return true; } };

2.2消失的数字

算法思路:

设数组的大小为n,则之前的数组就是[0,n],数组中是[0,n]中缺失一个数形成的序列。若,我们把数组中的所有数,以及[0,n]中的所有数全部【异或】在一起,那么根据【异或】运算的【消消乐】规则,最终的异或结果就是缺失的数字。

//1.哈希 2.高斯定理 3.位运算 4.排序+(暴力或二分) class Solution { public: int missingNumber(vector<int>& nums) { int ret=0; for(auto i:nums) ret^=i; for(int i=0;i<=nums.size();i++) ret^=i; return ret; } };

2.3两整数之和

算法思路:

●异或^运算本质是【无进位加法】;

●按位与&操作能够得到【进位】;

●然后一直循环进行,直到【进位】变成0为止

class Solution { public: int getSum(int a, int b) { while(b){ int x=a^b;//无进位相加的结果 //排除-1的情况 unsigned int carry=(a&b)<<1;//进位 a=x; b=carry; } return a; } };

2.4只出现一次的数字 II

算法思路:

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

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

class Solution { public: int singleNumber(vector<int>& nums) { int ret=0; for(int i=0;i<32;i++){//依次修改ret中的每一位 int sum=0; for(auto x:nums)//计算nums中所有第i位的和 if(x&(1<<i)) sum++; sum%=3; if(sum&1) ret|=1<<i; } return ret; } };

2.5只出现一次的数字 III

算法思路:

1.将所有数异或在一起,由于只有两个数出现一次,其余都出现两次。所以最后的结果为a^b

2.a和b不相等,因此a和b的二进制一定有至少一位不相同,

class Solution { public: vector<int> singleNumber(vector<int>& nums) { //1.将所有的数异或在一起 int tmp=0; for(auto x:nums) tmp^=x; //2.找出a,b中比特位不同的那一位 int diff=0; while(1){ if(((tmp>>diff)&1)==1) break; else diff++; } //3.根据diff位的不同,将所有数划分成两类 int a=0,b=0; for(auto x:nums){ if((1&(x>>diff))==1) b^=x; else a^=x; } return {a,b}; } };

2.6消失的两个数字

本题就是 2.2消失的数字+2.5只出现一次的数字 III组合起来的题。

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

class Solution { public: vector<int> missingTwo(vector<int>& nums) { //1.将所有的数异或在一起 int tmp=0; for(auto x:nums) tmp^=x; for(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(auto x:nums){ if((1&(x>>diff))==1) b^=x; else a^=x; } for(int i=1;i<=nums.size()+2;i++){ if((1&(i>>diff))==1) b^=i; else a^=i; } return {a,b}; } };

Read more

mac 安装并使用claude code

mac 安装并使用claude code

Claude Code是什么 Claude Code 是由 Anthropic 开发的一种基于命令行(CLI)的 AI 编程智能体(Agent),它深度集成在终端中,旨在帮助开发者高效地编写、调试、重构代码及管理项目。与仅用于对话的聊天机器人不同,Claude Code 能理解整个代码库的上下文,直接修改文件,运行测试,是真正的“AI 结对编程助手” 主要核心特性 * 终端原生应用 (CLI): 直接在开发者的命令行工具中运行,无需频繁切换软件。 * 上下文感知 (Context-Aware): 能深入理解整个项目代码,理解文件间的关系,而非仅处理零散的代码片段。 * 高权限操作 (Agentic Ability): 具有读取文件、修改代码、创建文件、运行测试、提交代码(git)等自主能力。 * 多任务处理: 支持编写功能代码、调试错误、重构代码、维护文档(

By Ne0inhk
Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭高性能 Server-Sent Events 流、实现鸿蒙端实时数据推送与长连接保活优化方案

Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭高性能 Server-Sent Events 流、实现鸿蒙端实时数据推送与长连接保活优化方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 sse_stream 的适配 鸿蒙Harmony 实战 - 驾驭高性能 Server-Sent Events 流、实现鸿蒙端实时数据推送与长连接保活优化方案 前言 在鸿蒙(OpenHarmony)生态的即时性应用场景中,如金融级实时行情、直播间弹幕以及 AI 模型的流式回复(Streaming Response),我们需要一种比轮询更高效、比 WebSocket 更轻量的数据下发机制。 SSE(Server-Sent Events)作为 HTML5 规范下的长连接利器,以其对 HTTP 协议的完美兼容和自动重连的天生特性,在现代移动开发中大放异彩。 sse_stream 库为 Flutter 提供了精简且强大的 SSE 接入能力。在鸿蒙适配实战中,

By Ne0inhk
【Ubuntu datasophon1.2.1 二开之六:解决CLICKHOUSE安装问题】

【Ubuntu datasophon1.2.1 二开之六:解决CLICKHOUSE安装问题】

Ubuntu datasophon1.2.1 二开之六:解决CLICKHOUSE安装问题 * 背景 * 问题 * 解决 * 下载ClickHouse * 在DataSophon配置ClickHouse及定制策略代码 * 1.构造tar.gz包 * 2.配置组件配置文件 * 3.定制策略处理代码 * 集群配置 * 最后 背景 安装完HIVE之后,就剩下spark,flink,clickhouse。安装spark,flink比较简单顺利。准备安装OLAP 数据库clickhouse,发现datasophon 1.2.1 组件没有,没办法只能添加一个。 问题 如何添加clickhouse组件呢?首先下载跟操作系统匹配的clickhouse版本。其次了解为datasophon添加组件需要做哪些事情。后面详细说明 解决 下载ClickHouse 我的ubuntu版本为: Welcome to Ubuntu 24.04.2LTS(GNU/

By Ne0inhk
鸿蒙APP开发从入门到精通:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生

鸿蒙APP开发从入门到精通:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生

《鸿蒙APP开发从入门到精通》第14篇:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生 📱💳🤖 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第14篇——订单管理、支付管理、AI原生篇,100%承接第13篇的「用户管理、商品列表、购物车」项目架构,完成鸿蒙电商购物车全栈项目的核心业务功能实现。 学习目标: * 掌握订单管理的设计与实现; * 实现创建订单、查看订单、取消订单; * 理解支付管理的设计与实现; * 实现微信支付、支付宝支付; * 掌握AI原生的设计与实现; * 实现AI搜索、AI推荐、AI客服; * 优化订单管理、支付管理、AI原生的用户体验(响应速度、数据安全、用户反馈)。 学习重点: * 鸿蒙APP订单管理的开发流程; * 订单管理的分类与使用场景; * 支付管理的设计与实现; * AI原生的设计与实现。 一、 订单管理基础 🎯 1.1 订单管理定义 订单管理是指对应用的订单进行管理,主要包括以下方面:

By Ne0inhk