初识算法 · 位运算(2)

目录

前言:

判定字符是否唯一

丢失的数字

比特位计数

只出现一次的数字III


前言:

​本文的主题是位运算,通过四道题目讲解,一道是判断字符是否唯一,一道是只出现一次的数字III,一道是比特位计数,一道是丢失的数字。
链接分别为:

338. 比特位计数 - 力扣(LeetCode) 面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

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

因为这些题目都是比较简单的,所以一一揉在一起介绍。

那么,话不多说,直接进行主题咯。


判定字符是否唯一

这道题目是作为面试题目出现的,作为一道面试题目,它有很多解法,比如我们可以使用哈希映射,使用map 使用set,使用函数count就可以判断是否出现了两次,也可以使用数组,遍历一遍,看哪个下标对应的值是2就返回false即可,解法是非常非常多的,说白了,这道题目就是让我们判读这堆“数字”里面是否有重复的数字。

那么前两个方法,多多少少都用到了额外的数据结构,额外的空间,相对来说还是没有那么好,毕竟空间还是大了一点,我们不妨利用位图的思想,一个Int就可以搞定,遍历到的时候,将位图对应的位置置为1,再次如果判断到了,直接返回false即可。

当然了,这道题目可以使用鸽巢原理进行优化,一共才26个英文字符,如果字符串的长度超过了26,直接返回false即可。

以上是题目解析 + 算法原理,以下是原理编写:

class Solution 
{
public:bool isUnique(string astr) {int bitmap = 0;for(auto e : astr){int x = e - 'a';if(((bitmap >> x) & 1) == 1) return false;else bitmap |= (1 << x);}    return true;}
};

丢失的数字

题目十分简单,我们现在应该思考的是,我们可以用多少种解法,这道题目无非就是让我们从一个连续的数集里面找到缺失的数字就可以了。“那这道题不就是缺失的数字吗”

第一种解法,高斯求和,因为数字肯定是从0开始到n的,所以我们可以将0到n这段区间的所有的数字加起来,最后减去给我们的这段区间的和即可。时间复杂度为O(N) 空间复杂度为O(1)

第二种解法,哈希映射,我们就开一个n + 1的数组,遍历数组,对应下标+1,看谁为2即可。时间复杂度为O(N) 空间复杂度为O(N),相对来说就不是那么好了。

第三种解法,遍历数组看i + 1是否为前一个数 + 1即可。

第四种解法,异或的运算律,数组的下标和数异或,看谁空出来了就可以了。

class Solution {
public:int missingNumber(vector<int>& nums) {        sort(nums.begin(),nums.end());if(nums[0] != 0) return 0;int i = 0;for(i = 0; i < nums.size() - 1; i++){if(nums[i] != (nums[i + 1] - 1)) return nums[i] + 1;}    return nums[i] + 1;}
};

对于第三种解法是比较差劲的,因为还是注意许多细节问题,比如需要先排序,还要判断1 2的这种情况,那么对于异或来说,就很不错了:

class Solution 
{
public:int missingNumber(vector<int>& nums) {int ret = 0;for(auto e : nums) ret ^= e;for(int i = 1;i <= nums.size();i++)ret ^= i;return ret;}
};

比特位计数

题目的要求是计算从0到n的所有的数中的二进制表示中1的个数,将个数插入到顺序表,然后返回就可以了。

那这道题不就是多次计算比特位中1的个数吗?我们甚至可以直接复用上篇那道题目的代码:

class Solution 
{
public:int countone(int n){int x = 0;while(n){n &= (n - 1);x++;}return x;}vector<int> countBits(int n) {vector<int> v;for(int i = 0; i <= n; i++){v.push_back(countone(i));}return v;}
};

只出现一次的数字III

这道题目无非就是找单身狗plus版本而已,就是缺失的数字嘛对吧!

我们需要找到两个数,那么异或整个数组肯定是少不了的,异或了之后,剩余的是两个数的异或结果,那么我们如何分离出来呢?

我们可以结合基本题目 :提取最低位的1,提取出来之后,两个只出现一次的数字在该位上一定是不同的,因为异或出来结果是1,其他的数也异或掉了,所以一定是一个为1,一个为0。

那么我们利用这个特点,将数组中的每个数组和最低位的数字一&运算一下,就可以得到结果了,因为没有要求顺序,所以我们可以直接输出。

class Solution 
{
public:vector<int> singleNumber(vector<int>& nums) {//先将整个数组异或int ret = 0;for(auto e : nums) ret ^= e;//获取最低位的1->实际上是分组// int low_bit = ret & -ret;int low_bit = (ret == INT_MIN ? ret : ret & (-ret));//开始分组int ans1 = 0, ans2 = 0;for(auto e : nums){if(e & low_bit) ans1 ^= e;else ans2 ^= e;}return { ans1, ans2 };}
};

以上就是位运算的多个题目解析。


感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14334.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大数据新视界 -- 大数据大厂之 Impala 性能优化:基于数据特征的存储格式选择(上)(19/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

[产品管理-76]:延续是创新与颠覆式创新的比较

目录 一、概述 1、定义与特征 2、市场影响与竞争策略 3、实施难度与风险 4、案例分析 二、示例 1. 延续性创新示例 2. 创新示例 3. 颠覆式创新示例 一、概述 延续性创新与颠覆式创新是技术创新领域的两种重要策略&#xff0c;它们在多个方面存在显著差异。 以下是对…

JAVA学习日记(十五) 数据结构

一、数据结构概述 数据结构是计算机底层存储、组织数据的方式。 数据结构是指数据相互之间以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业务场景来进行选择。 二、常见的数据结构 &#xff08;一&#xff09;栈 特点&…

自动化测试工具Ranorex Studio(三十)-代码模块中使用变量快照

为了在代码模块中使用数据连接器提供的值&#xff0c;你需要在代码中添加一个变量。使用右键菜单项’Insert Module Variable’。 添加一个新的变量到您的代码模块 指定变量名和默认值 通过添加一个新的变量&#xff0c;Ranorex Studio 会在光标位置插入一段新代码——由一个…

Python技巧:查询模块的版本号的方法

1,pycharm里面的 Python interpreter 或者 Python package 2&#xff0c;通过 __version_info__ import matplotlib print(matplotlib.__version_info__) 3&#xff0c;查看目录里面的 _version.py 文件

​​​​​​​15TS Series TVS 的解析

15TS Series 1500W Transient Voltage Suppresso指的是一系列高性能的瞬态电压抑制二极管&#xff08;Transient Voltage Suppressor&#xff0c;TVS&#xff09;&#xff0c;这些二极管由时源芯微&#xff08;TimeSource&#xff09;设计用于保护敏感的电子设备免受瞬态过电压…

Python学习从0到1 day27 Python 高阶技巧 ① 闭包

目录 一、闭包 作用 示例 二、nonlocal关键字 示例 三、atm取钱的闭包实现 四、闭包注意事项 优点 缺点 我陪你走了一段路&#xff0c;你最了解我不是吗 —— 24.11.11 一、闭包 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部…

python成长技能之网络编程

文章目录 一、初识Socket1.1 什么是 Socket?1.2 socket的基本操作1.3 socket常用函数 二、基于UDP实现客户端与服务端通信三、基于TCP实现客户端与服务端通信四、使用requests模块发送http请求 一、初识Socket 1.1 什么是 Socket? Socket又称"套接字"&#xff0c;…

[ACTF2020 新生赛]Upload 1--详细解析

信息收集 题目告诉我们是一道upload&#xff0c;也就是文件上传漏洞题目。 进入界面&#xff0c;是一个灯泡&#xff0c;将鼠标放在图标上就会出现文件上传的相应位置&#xff1a; 思路 文件上传漏洞&#xff0c;先看看有没有前端校验。 在js源码中找到了前端校验&#xff…

光伏设计软件怎么选?有哪些推荐?

在光伏电站的开发建设中&#xff0c;专业设计软件是提升电站能效、降低开发成本的重要工具。市场上存在许多优秀的光伏设计软件&#xff0c;能够通过还原现状和三维建模来呈现出最符合实际需求的设计方案&#xff0c;究竟该怎么选呢&#xff1f; -易用性&#xff1a;一些软件操…

刷题强训(day06) -- 大数加法、链表相加、大数乘法

目录 1、大数加法 1.1 题目 1.2 思路 1.3 代码实现 2、链表相加&#xff08;二&#xff09; 2.1 题目 2.2 思路 2.3 代码实现 3、大数乘法 3.1 题目 3.2 思路 3.3 代码实现 1、大数加法 1.1 题目 1.2 思路 这道题可以模拟列竖式相加解答&#xff0c; 将每一位都转…

雷池waf安装并部署防护站点

雷池waf安装并部署防护站点 最低配置要求 操作系统&#xff1a;Linux 指令架构&#xff1a;x86_64 软件依赖&#xff1a;Docker 20.10.14 版本以上 软件依赖&#xff1a;Docker Compose 2.0.0 版本以上 最小化环境&#xff1a;1 核 CPU / 1 GB 内存 / 5 GB 磁盘 写在前面 本文…

AI技术赋能电商行业:创新应用与未来展望

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐步渗透到各行各业&a…

【Linux】进程(状态)

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各…

自动化测试框架的搭建详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近好多小伙伴都在说接口自动化测试&#xff0c;那么究竟什么是接口自动化测试呢&#xff1f;让我们一起往下看就知道了&#xff0c;首先我们得先弄清楚下面这…

重拾CSS,前端样式精读-媒体查询

前言 本文收录于CSS系列文章中&#xff0c;欢迎阅读指正 说到媒体查询&#xff0c;大家首先想到的可能是有关响应式的知识点&#xff0c;除此之外&#xff0c;它还可以用于条件加载资源&#xff0c;字体大小&#xff0c;图像和视频的优化&#xff0c;用户界面调整等等方面&am…

4TS Series TVS 的解析

4TS Series 400W Transient Voltage Suppressor指的是时源芯微&#xff08;TimeSource&#xff09;生产的一系列瞬态电压抑制二极管&#xff08;Transient Voltage Suppressor&#xff0c;TVS&#xff09;&#xff0c;这些二极管专门设计用于保护敏感电子设备免受雷电、电源浪涌…

语义分割数据增强,图像和标签同步对应详细增强教程(附代码)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《图像增强》 &a…

本地部署 OpenHands

本地部署 OpenHands 0. 引言1. 部署 OpenHands2. 访问 OpenHands3. 验证 OpenHands 0. 引言 OpenHands 是一个由人工智能驱动的软件开发代理平台。 OpenHands 代理可以执行人类开发人员可以执行的任何操作&#xff1a;修改代码、运行命令、浏览网页、调用 API&#xff0c;甚至…

amber分子动力学

分子动力学模拟是分子模拟中最接近实验条件的模拟方法&#xff0c;能够从原子层面给出体系的微观演变过程&#xff0c;直观的展示实验现象发生的机理与规律&#xff0c;促使学术研究向着更高效、更经济、更有预见性的方向发展。可以解决和研究DNA的折叠和性质、蛋白与配体的识别…