《算法题讲解指南:优选算法-位运算》--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

用 Java 实现控制台版图书管理系统:从需求到代码的完整实践

用 Java 实现控制台版图书管理系统:从需求到代码的完整实践

我不是广告 个人主页-爱因斯晨 文章专栏-JAVA学习 好久不见~最近变了很多,也在忙。也有点儿小体会吧,最近遇到了很多事儿,我也想了很多。我个人的想法还是:不能给自己的以后留下任何污点,因为路还很长,我这才刚开始。要坚守自己的底线吧!“苟非吾之所有,虽一毫而莫取” 最后,衷心祝大家,身心健康,注意好身体! > 不知道大家喜欢听歌嘛?最近发现一个可以白嫖会员的东西,苹果音乐可以白嫖会员(新用户两个月,老用户一个月),苹果安卓都能用,领取之后记得关闭自动续费哦~曲库还是很多的,大家可以点击链接领取。领取链接绝对免费!绝对白嫖! 作为一名 Java 开发者,我们常常忙于框架和中间件的使用,却容易忽略基础语法的实战价值。今天,我将带大家从零开始实现一个控制台版图书管理系统,这个项目虽然简单,却涵盖了 Java 核心基础的大部分知识点,非常适合初学者巩固基础,也能让资深开发者重温 Java 设计的初心。 项目需求分析 在开始编码之前,我们需要明确这个图书管理系统应该具备哪些核心功能。

By Ne0inhk

JDK21虚拟线程初窥:从平台线程到轻量级并发革命

目录 引言:并发编程的演进之路 一、虚拟线程的核心优势 1.1 资源效率的革命性提升 1.2 调度机制的质变 二、Spring Boot中的实战配置 2.1 配置开关的深层含义 2.2 混合模式的最佳实践 三、性能对比与适用场景 3.1 量化性能提升 3.2 场景选择指南 四、未来展望 引言:并发编程的演进之路         随着历史的车轮滚滚向前,Java并发编程迎来了里程碑式的变革。从早期的重量级线程到线程池优化,再到如今JDK21推出的虚拟线程(Virtual Threads),Java正在重塑高并发应用的开发范式13。本文将结合具体代码示例,深入探讨这一革命性特性。 一、虚拟线程的核心优势 1.1 资源效率的革命性提升         虚拟线程与传统平台线程最显著的区别在于资源消耗。每个平台线程默认需要1MB栈空间,而虚拟线程仅需几百字节内存,使得单机创建百万级线程成为可能25。

By Ne0inhk
【JDK】-JDK 17 新特性整理(比较全)

【JDK】-JDK 17 新特性整理(比较全)

JDK 17 新特性 1、JDK 17中的Pattern类增强了哪些功能? 1. 新增asMatchPredicate方法: JDK 17的Pattern类新增了asMatchPredicate方法,可以将正则表达式编译为Predicate。 2. 增强了Unicode属性支持: JDK 17中的Pattern类增强了对Unicode属性的支持,使得正则表达式可以更好地处理Unicode字符。 3. 引入了新的转义语法: JDK 17引入了一种新的转义语法,可以更方便地转义正则表达式中的特殊字符,提高了正则表达式的可读性和可维护性。 4. 优化了性能: JDK 17对Pattern类的底层实现进行了优化,提升了正则表达式匹配的性能和效率。 5. 增加了对断言的支持: JDK 17中的Pattern类增加了对断言的支持,可以更灵活地进行正则表达式的匹配和处理。 2、JDK 17中的HTTP/2 Client有哪些新特性? 1. 提供了WebSocket支持: JDK 17中的HTTP/2 Client新增了对WebSocket的支持,使得开发者可以更方便地进行WebS

By Ne0inhk
Flutter 三方库 js_wrapping 的鸿蒙化适配指南 - 实现 Dart 与 JavaScript 的无缝对象包装、支持强类型回调与属性映射

Flutter 三方库 js_wrapping 的鸿蒙化适配指南 - 实现 Dart 与 JavaScript 的无缝对象包装、支持强类型回调与属性映射

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 js_wrapping 的鸿蒙化适配指南 - 实现 Dart 与 JavaScript 的无缝对象包装、支持强类型回调与属性映射 前言 在进行 Flutter for OpenHarmony 的 Web 混合开发时,频繁地在 Dart 层与底层 JavaScript 环境进行数据交互是不可避免的。虽然官方提供了基本的 dart:js,但在处理复杂的 JS 对象和回调时,代码往往会变得杂乱无章。js_wrapping 提供了一个更优雅的、类型安全的包装层。本文将指导大家如何在鸿蒙端利用该库提升 JS 互操作的开发体验。 一、原理解析 / 概念介绍 1.1 基础原理

By Ne0inhk