《算法题讲解指南:优选算法-位运算》--33.判断字符是否唯一,34.丢失的数字

《算法题讲解指南:优选算法-位运算》--33.判断字符是否唯一,34.丢失的数字

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》《算法题讲解指南》--从优选到贪心

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

位运算基础前置知识:

位1的个数

比特位计数

汉明距离

只出现一次的数字

只出现一次的数字|||

34. 判断字符是否唯一

题目链接:

题目描述:

题目示例:

解法(位图的思想):

算法思路:

C++算法代码:

算法总结及流程解析:

35. 丢失的数字

题目链接:

题目描述:

题目示例:

解法(位运算):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


位运算基础前置知识:

      回顾了上面位运算基础前置的知识这里有五道非常简单的题可以试试手,都是考察位运算的题目:

位1的个数

191. 位1的个数 - 力扣(LeetCode)

C++算法代码:

class Solution { public: int hammingWeight(int n) { int count = 0; while(n) { n &= (n - 1); count++; } return count; } };

比特位计数

338. 比特位计数 - 力扣(LeetCode)

C++算法代码:

class Solution { public: vector<int> countBits(int n) { vector<int> ans(n + 1, 0); for(int i = 0; i <= n; i++) { int count = 0; int num = i; while(num) { num &= (num - 1); count++; } ans[i] = count; } return ans; } };

汉明距离

461. 汉明距离 - 力扣(LeetCode)

C++算法代码:

class Solution { public: int hammingDistance(int x, int y) { int count = 0; int ret = x ^ y; while(ret) { ret &= (ret - 1); count++; } return count; } };

只出现一次的数字

136. 只出现一次的数字 - 力扣(LeetCode)

C++算法代码:

class Solution { public: int singleNumber(vector<int>& nums) { int val = 0; for(auto e : nums) { val ^= e; } return val; } };

只出现一次的数字|||

260. 只出现一次的数字 III - 力扣(LeetCode)

C++算法代码:

class Solution { public: if(nums.size() == 2) { return nums; } sort(nums.begin(), nums.end()); vector<int> res; int ans = 0; for(int i = 0; i < nums.size(); i++) { ans ^= nums[i]; } for(int i = 0; i < nums.size(); i += 2) { if(nums[i] != nums[i + 1]) { res.push_back(nums[i]); ans ^= nums[i]; break; } } res.push_back(ans); return res; } };

34. 判断字符是否唯一

题目链接:

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

题目描述:

题目示例:

解法(位图的思想):

算法思路:

      利用【位图】的思想,每一个【比特位】代表一个【字符,一个 int 类 型的变量 32 位足够表示所有的小写字母。比特位里面如果是 0,表示这个字符没有出现过。比特位里面的值是 1,表示该字符出现过
      那么我们就可以用一个【整数】来充当【哈希表】。

C++算法代码:

class Solution { public: bool isUnique(string astr) { //解法一:数组模拟实现哈希表 //解法一通过模拟实现哈希表来存放每个字符映射到数组的对应位置 //代码非常简单,这里就不演示了,而且因为需要额外使用数据结构不算加分项 //解法二:位图(不需要使用额外的数据结构) if(astr.size() > 26) { return false; } int m = 0; //作为比特位哈希表,通过一个数的二进制表示每个比特位存放对应的字符 for(int i = 0; i < astr.size(); i++) { //先判断当前字符是否在比特位哈希表中存在过 if(m >> (astr[i] - 'a') & 1) { return false; } //如果判断为假则该字符没有出现过,则相对应的比特位从0变成1 m = m | (1 << (astr[i] - 'a')); } return true; } };

算法总结及流程解析:

35. 丢失的数字

题目链接:

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

题目描述:

题目示例:

解法(位运算):

算法思路:

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

C++算法代码:

class Solution { public: int missingNumber(vector<int>& nums) { //解法一:高斯求和 // int ret = 0; // for(int i = 0; i < nums.size(); i++) // { // ret += (i + 1); // ret -= nums[i]; // } // return ret; //解法二:位运算 int ret = 0; for(int i = 0; i < nums.size(); i++) { ret ^= nums[i] ^= (i + 1); } return ret; } };

算法总结及流程解析:

结束语

      到此,33.判断字符是否唯一,34.丢失的数字 这两道算法题就讲解完了。通过两道经典例题讲解位图与异或技巧。33题利用位图思想,用整数比特位标记字符出现情况,实现O(1)空间复杂度判断字符唯一性。34题运用异或消消乐特性,通过数组与完整序列异或找出缺失数字。希望大家能有所收获!

Read more

Flutter 组件 wilt 适配鸿蒙 HarmonyOS 实战:极简数据序列化,构建边缘计算场景下的轻量级存取矩阵

Flutter 组件 wilt 适配鸿蒙 HarmonyOS 实战:极简数据序列化,构建边缘计算场景下的轻量级存取矩阵

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 wilt 适配鸿蒙 HarmonyOS 实战:极简数据序列化,构建边缘计算场景下的轻量级存取矩阵 前言 在鸿蒙(OpenHarmony)生态迈向万物互联、涉及大量传感器快照存取、临时配置缓存或轻量化元服务(Atomic Service)的背景下,如何以极低的算力开销实现数据的序列化与持久化,已成为决定应用启动速度与响应灵敏度的“毛细血管工程”。在鸿蒙设备这类强调微内核效率与极致能耗控制的移动终端上,如果针对每一个微小的临时数据都要动用重型的 SQL 引擎或复杂的 ORM 框架,不仅会由于由于繁重的类加载过程导致首帧渲染延迟,更会由于由于冗余的磁盘 I/O 造成不必要的能源开销。 我们需要一种能够直接操作内存映射、支持动态 Schema 扩展且代码体积极其微小的轻量级存取方案。 wilt 为 Flutter 开发者引入了一套面向边缘计算的极简数据操作范式。它抛弃了复杂的索引预建与繁琐的表结构声明,支持以原生的 Map 结构进行即时持久化

By Ne0inhk
从 App 到 Agent:鸿蒙应用形态正在改变

从 App 到 Agent:鸿蒙应用形态正在改变

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名) 大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。 我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案, 在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。 技术方向:前端 / 跨端 / 小程序 / 移动端工程化 内容平台:掘金、知乎、ZEEKLOG、简书 创作特点:实战导向、源码拆解、少空谈多落地 文章状态:长期稳定更新,大量原创输出 我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、

By Ne0inhk
【教程】如何在WSL2:Ubuntu上部署llama.cpp

【教程】如何在WSL2:Ubuntu上部署llama.cpp

WSL2:Ubuntu部署llama.cpp llama.cpp 是一个完全由 C 与 C++ 编写的轻量级推理框架,支持在 CPU 或 GPU 上高效运行 Meta 的 LLaMA 等大语言模型(LLM),设计上尽可能减少外部依赖,能够轻松在多种后端与平台上运行。 安装llama.cpp 下面我们采用本地编译的方法在设备上安装llama.cpp 克隆llama.cpp仓库 在wsl中打开终端: git clone https://github.com/ggml-org/llama.cpp cd llama.cpp 编译项目 编译项目前,先安装所需依赖项: sudoapt update sudoaptinstall -y build-essential cmake git#

By Ne0inhk
Flutter 三方库 ff_annotation_route 的鸿蒙化适配指南 - 掌握基于注解的自动化路由管理技术、助力鸿蒙大型 HAP 项目构建极速解构且类型安全的页面跳转体系

Flutter 三方库 ff_annotation_route 的鸿蒙化适配指南 - 掌握基于注解的自动化路由管理技术、助力鸿蒙大型 HAP 项目构建极速解构且类型安全的页面跳转体系

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 ff_annotation_route 的鸿蒙化适配指南 - 掌握基于注解的自动化路由管理技术、助力鸿蒙大型 HAP 项目构建极速解构且类型安全的页面跳转体系 前言 在 OpenHarmony 鸿蒙应用向“大规模、模块化、组件化”演进的工程实战中,路由(Routing)管理始终是维护成本最高的环节之一。传统的硬编码路由表(String-based Routes)在面对数百个页面时,极易出现拼写错误、参数透传混乱以及耦合度过高等问题。如何实现“写完页面,路由自动生成”?如何让每一个页面跳转都具备强类型校验?ff_annotation_route 作为一个专注于“注解驱动自动化”的路由生成引擎,旨在为鸿蒙开发者提供一套工业级的路由治理方案。本文将详述其在鸿蒙端的实战技法。 一、原原理分析 / 概念介绍 1.1

By Ne0inhk