算法专题五: 位运算

目录

  • 常见位运算总结
  • 1. 位1的个数
  • 2. 比特位计数
  • 3. 汉明距离
  • 4. 只出现一次的数字
  • 5. 只出现一次的数字Ⅲ
  • 6. 判定字符是否唯一
  • 7. 丢失的数字
  • 8. 两正数之和
  • 9. 只出现一次的数字Ⅲ
  • 10. 消失的两个数字

常见位运算总结

在这里插入图片描述

重点 :

在这里插入图片描述


1. 位1的个数

在这里插入图片描述
算法思路:

这道题就用到了我们总结的那个第七个方法, 干掉最右侧的1, 知道全部为0位置, 记录并返回干掉次数即可.

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

法二: 遍历每一位进行按位与操作, 并没有方法一效率高

class Solution {
public:int hammingWeight(int n) {int ret = 0;for(int i = 0; i < 32 ; i++){if((n & 1) == 1) ret++;n >>= 1;}return ret;}
};

2. 比特位计数

在这里插入图片描述
算法思路: 本题也就是求出0到n中每一个数的比特位中1的个数, 很容易想到的方法就是,遍历数组, 按照上一题的思路求出i的1比特位即可.

class Solution {
public:vector<int> countBits(int n) {vector<int> ans;for(int i = 0 ; i <= n; i++){int tmp = i, ret = 0;while(tmp){tmp &= (tmp - 1);ret++;}ans.push_back(ret);}return ans;}
};

3. 汉明距离

在这里插入图片描述

算法思路:

也就是求出两个数的比特位不同的个数, 首先对两正数进行异或运算, 不同为1, 然后求出tmp中1的个数, 沿用之前的方法, 先找出最右侧的1, 然后干掉最右侧的1, 记录次数即可.

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

4. 只出现一次的数字

在这里插入图片描述
算法思路: 仅需将所有数字进行异或, 相同的就被消去了, 最后的数字即为结果.

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(int i = 0; i < nums.size(); i++){ret = ret ^ nums[i];}return ret;}
};

5. 只出现一次的数字Ⅲ

在这里插入图片描述

算法思路: 首先将数组进行异或处理, 结果就是最后两个不同的数字异或的结果, 因为这两个数字不相同, 所以一定有比特位异或的结果为1, 我们仅需据此进行划分为两组即可, 这里我们默认查找最右侧的1, 然后据此进行划分, 分别进行异或, 最后返回分别异或的结果.

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int ret = 0, tmp = 0;for(auto& e : nums)tmp ^= e;int pos = -1;for(int i = 0; i < 32; i++){if((tmp & 1) == 1){pos = i;break;}tmp = tmp >> 1;}int x1 = 0,x2 = 0;for(auto& e : nums){if(((e >> pos) & 1) == 1)x1 ^= e;else x2 ^e;}return {x1,x2};}
};

6. 判定字符是否唯一

在这里插入图片描述

本道题可以采用位图的方法进行优化, 因为数据范围只有小写字母, 我们进行一个int的比特位当成哈希表来用即可, 1和0进行两种状态的标记, 处理之前还可以使用鸽巢原理进行一下优化, 也就是26个字母如果字符串长度超过26那么一定有相同的字符串, 这时候直接返回false即可

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

7. 丢失的数字

在这里插入图片描述
算法思路: 仅需进行异或操作, 将ret和数组进行异或并且和0到size之间的所有i进行异或即可.

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

8. 两正数之和

在这里插入图片描述

算法思路: 本题要求不能使用+ 和 - 运算符将两个数进行相加, 开始总结位运算的时候, 我们也说过^表示的就是我进位相加, 但是进位怎么办, 两数&的结果即为进位, 但是进位并不是加到本位上的, 应该加到前一位, 所以结果我们要进行左移然后相加, 那么问题又来了, 不让使用+怎么进行相加呢, 其实我们在重复上面的操作, 循环即可, 直到进位为0.

在这里插入图片描述

class Solution {
public:int getSum(int a, int b) {while(b != 0){int add = a ^ b;int carry = (a & b) << 1;a = add;b = carry;}return a;}
};

9. 只出现一次的数字Ⅲ

在这里插入图片描述

算法思路: 理解题意即可知, 这些数字的每一个bit为相加的结果要么是三的倍数,也就是ret的这一位是0, 要么被三整除余数为1, 也就是ret的这一位是1

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(int i = 0; i < 32; i++){int sum = 0;for(auto x : nums)sum += ((x >> i) & 1);if(sum % 3 == 1)ret |= (1 << i);}return ret;}
};

10. 消失的两个数字

在这里插入图片描述

算法思路: 首先先将nums中的每一个数和0到N之间每一个数进行异或, 结果为两个数异或的结果, 然后找出1那个位置, 进行划分即可, 分成两组, 再次进行分别异或, 即可得出结果.

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {int tmp = 0;for(int i = 1; i <= nums.size() + 2; i++)tmp ^= i;for(auto x : nums)tmp ^= x;int dif = 0;while(1){if(((tmp >> dif) & 1) == 1) break;dif++;}int a = 0, b = 0;for(int i = 0; i <= nums.size()+2; i++){if(((i >> dif) & 1) == 1)a ^= i;else b ^= i;}for(auto x : nums){if(((x >> dif) & 1)== 1)a ^= x;else b ^= x;}return {a,b};}
};

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

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

相关文章

图解 微信开发者工具 小程序源码 调试、断点标记方法 , 微信小程序调试器,真机调试断点调试方法,小程序网络API请求调试方法 总结

在我们使用微信开发者工具进行微信小程序开发的时候&#xff0c;在这个微信开发者工具的代码编辑框里面我们是无法像使用vscode, idea等IDE工具时那样直接对代码打断点进行调试&#xff0c; 原因是小程序实际上他就是一个web浏览器应用的包装, 在其内部使用的还是类似chrome的…

C/C++程序员为什么要了解汇编?了解汇编有哪些好处?如何学习汇编?

目录 1、概述 2、从汇编的角度去理解问题的若干实例说明 2.1、使用空指针去访问类的数据成员或调用类的虚函数为什么会引发崩溃&#xff1f; 2.2、从汇编代码的角度去理解多线程的执行细节&#xff0c;去理解多线程在访问共享资源时为什么要加锁 2.3、使用Windbg静态分析d…

Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))

1.Canal介绍 Canal把自己伪装成从数据库&#xff0c;获取mysql主数据库的日志&#xff08;binlog&#xff09;信息&#xff0c;所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量…

Spring Boot2.x教程:(五)日志分割

日志分割 1、概述2、为什么选择Logback2.1、创建配置文件2.2、配置说明2.3、修改应用程序配置2.4、启动应用程序 3、总结 大家好&#xff0c;我是欧阳方超&#xff0c;可以扫描下方二维码关注我的公众号“欧阳方超”&#xff0c;后续内容将在公众号首发。 1、概述 在现代应用程…

ubuntu18.04系统中图形化界面

一、Ubuntu 18.04 中&#xff0c;使用 GDM 作为默认的图形用户界面&#xff08;GUI&#xff09;管理器。GDM 是 GNOME Display Manager 的缩写&#xff0c;它是用于 Ubuntu 的显示管理器&#xff0c;负责处理登录和会话管理。 通过命令行重启 Ubuntu 18.04 上的图形界面服务&am…

技术路线图用什么画?用这个在线工具轻松完成绘制!

在当今快速发展的技术世界中&#xff0c;技术路线图已成为企业和团队不可或缺的战略规划工具。它不仅能够清晰地展示技术发展方向&#xff0c;还能帮助团队成员、利益相关者和投资者更好地理解和参与技术战略的制定过程。但不可否认的是&#xff0c;创建一个有效的技术路线图并…

付费计量系统实体和接口(6)

13.7.3 Sub-classification of the Metering functions计量功能的子分级 The Metering function primarily deals with the measurement of the quantity of delivered electrical energy to the consumer. These measurements are made available for use by other functions …

qt 3D编程

Qt 3D是一个用于构建交互式3D图形应用的库&#xff0c;它是Qt库的一 部分。Qt 3D提供了一组C和QMLAPI&#xff0c;帮助开发者快速构 建3D应用程序。 一、核心模块 Qt3DCore 功能&#xff1a;提供3D场景中的基本概念&#xff0c;如实体&#xff08;Entity&#xff09;、组件&…

R语言运行地理探测器模型

地理探测器&#xff08;GeoDetector&#xff09;是一种用于空间分析的统计模型&#xff0c;它能够探测空间分异性以及揭示其背后驱动力的一组方法。它的核心思想是基于这样的假设&#xff1a;如果某个自变量对某个因变量有重要影响&#xff0c;那么自变量和因变量的空间分布应该…

java的LinkedList

java的LinkedList 什么是LinkedListLinkedList的模拟实现LinkedList的使用ArrayList和LinkedList的区别 什么是LinkedList LinkedList的官方文档 LinkedList的底层是双向链表结构&#xff0c;由于链表没有将元素存储在连续的空间中&#xff0c;元素存储在单独的结点中&#xf…

【Redis】Set类型的常用命令与应用场景

目录 1.命令小结 2.命令解析 3.编码方式与应用场景 1.命令小结 &#xff08;1&#xff09;set的特点 1&#xff09;set中存放的数据也都是String类型 2&#xff09;set集合中的元素是无须的 3&#xff09;set集合中的元素是唯一的&#xff0c;不可重复 &#xff08;2&a…

MySql 之 Binglog 复制

复制是一种将数据从一个 MySQL 数据库服务器异步复制到另一个的技术。使用 MySQL 复制选项&#xff0c;您可以复制所有数据库、选定的数据库甚至选定的表&#xff0c;具体取决于您的使用情况。 前提条件 确保在源服务器上启用了二进制日志记录。确保复制配置中的所有服务器都有…

uniapp——h5的控制台调试、h5调试

介绍 小程序在调试的时候可以打开调试模式&#xff0c;可以看到console.log的打印情况。 但是H5运行到手机上没有默认的调试的模式&#xff0c;但是可以人为手动加一个。 如何实现 1、main.js文件 import Vconsole from ‘vconsole’ /** 关闭正式环境打印日志&#xff…

Centos7.5 安装和配置jdk17

目录 一、下载JDK17包 二、将安装包放入服务器 三、解压jdk包到/usr/lib/jvm 四、修改JDK环境配置 1、打开配置文件 2、最后一行插入 3、立即生效 4、检查版本 一、下载JDK17包 访问网址:Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads…

音频功放工作原理:【B类】

上一节我们讲了A类音频功放的工作原理&#xff0c;也知道了它的优缺点&#xff1a; A类功放优点&#xff1a;高增益&#xff0c;低失真&#xff0c;音质好 A类功放缺点&#xff1a;热量高&#xff0c;效率低&#xff0c;功率小 为了解决A类功放的缺点&#xff0c;业界又引入…

重学SpringBoot3-集成Redis(十)之实时统计和分析

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;十&#xff09;之实时统计和分析 1. 实时统计和分析的常见场景2. 使用 Redis 数据结构进行实时统计3. 使用Redis String实现计数器…

原来机器学习那么简单——K近邻回归

引言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 一、什么是K近邻回归&#xff1f; K近邻回归&…

10.9QT对话框以及QT的事件机制处理

MouseMoveEvent(鼠标移动事件) widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 设置窗口为无边框&#xff0c;去掉标题栏等装饰this->setWi…

电脑缺失msvcr120.dll怎样修复,马上教你6种修复方法

在用电脑的时候&#xff0c;经常会碰到各种错误提示&#xff0c;比如“msvcr120.dll丢失”&#xff0c;导致的结果就是某些程序无法正常启动。那么&#xff0c;这个dll文件到底是啥&#xff0c;为什么会丢失&#xff0c;怎么解决呢&#xff1f;将通过这篇文章详细解释一下&…

智能优化算法-引力搜索优化算法(GSA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 引力搜索优化算法 (Gravitational Search Algorithm, GSA) 是一种基于牛顿万有引力定律的元启发式优化算法&#xff0c;由Rashedi等人于2009年提出。GSA通过模拟天体之间的引力作用来搜索最优解&#xff0c;适用…