《算法题讲解指南:优选算法-位运算》--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 开发日记】设计一个支持万人同时抢购商品的秒杀系统?

目录 一、系统架构设计 1. 分层架构 2. 具体组件 二、核心问题解决方案 1. 超卖问题 解决方案一:Redis原子操作 解决方案二:数据库乐观锁 解决方案三:预扣库存 2. 高并发请求处理 2.1 流量削峰 2.2 分层过滤 3. 系统性能优化 3.1 缓存策略 3.2 读多写少优化 4. 详细实现方案 4.1 秒杀流程 4.2 库存同步方案 三、高可用保障 1. 限流降级策略 2. 熔断降级 四、监控与告警 1.

By Ne0inhk

Java最新面试题库——精选100道(含精简答案),收藏这篇就够了

JavaEE面试题整理 * 一、Java基础篇 * 二、JVM篇 * 三、Tomcat篇 * 四、MyBatis篇 * 五、Spring篇 * 六、SpringMVC面试题整理 * 七、Redis篇 * 八、Mongodb篇 * 九、MQ篇 * 十、Shiro篇 * 十一、搜索引擎篇 * 十二、Nginx篇 * 十三、SpringBoot篇 * 十四、Dubbo篇 一、Java基础篇 1、JAVA中的几种基本数据类型是什么,各自占用多少字节? 浮点类型:float(4字节)、double(8个字) 整数类型:byte(1字节)、short(2字节)、int(4字节)、long(8字节) 字符类型:char(

By Ne0inhk
JavaScript模式——策略模式:告别if-else地狱,2个案例让你“策略”在握

JavaScript模式——策略模式:告别if-else地狱,2个案例让你“策略”在握

1. 策略模式是什么鬼? 简单说,策略模式就是帮你把一堆“算法”或者“规则”分别打包,让它们可以随时互换。就像你去旅行,可以选择飞机、火车、自驾,目的地一样,但方式随便换。这种模式的核心思想就是把“做什么”和“怎么做”分开。 比如,你要计算年终奖,绩效S和绩效A的算法不一样,但它们都是“计算奖金”这件事。策略模式就让你把这些算法一个个封装好,想用哪个就用哪个。 2. 策略模式长啥样? 策略模式通常有两部分: * 策略对象:负责具体干活,比如不同的奖金算法、不同的动画缓动公式。 * 环境对象:负责接收命令,然后把活派给某个策略。 听起来抽象?没关系,下面两个例子保你一看就懂。 3. 案例一:年终奖怎么算? 3.1 新手写法:if-else堆成山 刚入行的程序员可能会这么写: var

By Ne0inhk
Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用(363)

Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用(363)

Java 大视界 -- Java 大数据机器学习模型在金融衍生品市场波动特征挖掘与交易策略创新中的应用(363) * 引言: * 正文: * 一、Java 构建的金融数据处理架构 * 1.1 多源异构数据实时融合 * 1.2 新闻舆情与市场冲击建模 * 二、Java 驱动的波动特征挖掘与预测 * 2.1 多模型融合的波动率预测 * 2.2 极端行情预警与止损优化 * 三、基于波动特征的交易策略创新 * 3.1 跨市场套利策略 * 3.2 动态对冲策略 * 四、实战案例:从 “被动止损” 到 “主动盈利” * 4.1 股指期货量化基金:从 38% 回撤到 12% * 4.2 外汇期权交易:

By Ne0inhk