算法——位运算

常见位运算总结

  1. 基础位运算

    1. << >> ~
    2. 与&:有0就是0
    3. 或|:有1就是1
    4. 异或^:相同为0,相异为1 / 无进位相加image.png
  2. 给一个数n,确定他的二进制表示中的第x位是0还是1

    1. 让第x位与上1即可
    2. 先让n右移x位
    3. &上一个1(仅需考虑最低位,即最右边),所以与上1(0000001,只有最低位是1)image.png
  3. 将一个数n的二进制表示的第x位修改成1

    1. 和1进行或运算|,这样其他位置上的数字保持不变,只需要让第x位或1就行
    2. 先让1左移x位,然后和1进行或等运算

image.png

  1. 将一个数n的二进制表示的第x位修改成0

    1. 让第x位与上一个0即可,使其余位保持不变(决定权在上面自身)
    2. 让1左移x位后,按位取反
    3. n与等上这样一个数image.png
  2. 位图的思想

    1. 本质是一个哈希表,大多情况是数组的形式方便增删查改,可以用O(1)的时间复杂度来查找
    2. 现在用一个变量的二进制位记录信息。存储0表示一种信息,存储1表示一种信息。此时用一个变量我们就能实现增删查改。这里我们哈希表是一个变量,然后用变量中某一位的比特位的0、1来帮助我们记录信息。(2、3、4都是为位图服务的)image.jpeg
  3. 提取一个数(n)二进制表示中最右侧的1(该操作又称为lowbit,即把最低位的1提取出来)

    1. 即过这个操作后,image.png上面的数变为下面的数
    2. n按位与-n即可(负数是按位取反再加1)image.png
  4. 干掉一个数n二进制表示中最右侧的1

    1. n &(n-1)
    2. n-1本质上是当n从最右侧开始出现连续的0,做减法时会一直借位,一直借到最右边的1.即以最右侧的1作为分界线,让他右边的区域都变成相反数image.jpeg
    3. 然后再与&上nimage.png就能达到干掉最右侧的1的效果
  5. 位运算的优先级:能加括号就加括号

  6. 异或(^)运算的运算律

    1. a ^ 0 = a
    2. a ^ a = 0 (消消乐)
    3. a ^ b ^ c = a ^ (b ^ c)

一大堆数随便异或(不考虑运算顺序),结果是唯一的image.png
运用6、7
LeetCode191. 位1的个数
LeetCode318. 比特位计数
LeetCode461. 汉明距离
运用9
LeetCode136. 只出现一次的数字
LeetCode260. 只出现一次的数字III

判断字符是否唯一

判定字符是否唯一

题目解析

  • 确定一个字符串 s 的所有字符是否全都不同。
  • s[i]仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。

算法原理

  1. 解法一:哈希表(哈希数组hash[26]):因为题中已经说明仅包含小写字母,判断字符是否在哈希表里,如果不在放进哈希表,移动下一个位置。时间复杂度O(n),空间复杂度O(n)
  2. 位图思想:

image.png

  1. 优化点:鸽巢原理:因为一共有26个英文字母,当字符串的长度大于26时,一定会有重复的字符

代码实现

class Solution {
public:bool isUnique(string astr) {// 利⽤鸽巢原理来做的优化if(astr.size() > 26) return false;int bitMap = 0;for(auto ch : astr){int i = ch - 'a';// 先判断字符是否已经出现过if(((bitMap >> i) & 1) == 1) return false;// 把当前字符加⼊到位图中bitMap |= 1 << i;}return true;}
};

丢失的数字

丢失的数字

题目解析

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

算法原理

  1. hash表:创建一个大小为n+1的数组,这样下标刚好是0~n,然后一一对应去找。时间复杂度O(n),空间复杂度O(n)image.png
  2. 高斯求和:求出0~n所有数字的和,然后减去数组中的和,得出的结果就是缺失的结果.时间复杂度O(n),空间复杂度O(1)

image.png

  1. 位运算(异或运算的运算律):将数组中的数和0n全部进行异或,所有重复的数异或结果都是0,0n数剩下的一个和数组中的0异或(数组缺失),得出的结果就是缺失的。时间复杂度O(n),空间复杂度O(1)。image.png

代码实现

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

两整数之和

两整数之和

题目解析

不使用 运算符 + 和 - ,计算并返回两整数之和。

算法原理

  1. 笔试场上,不讲武德:直接return a+b
  2. 位运算(异或运算——无进位相加):
    1. 我们只需要找到进位即可。进位的情况是只有1和1会出现。这样就和按位与&的情况一样。并且进位是进到数字左边的位置上,所以我们还需让其进行左移,这样我们就得到了进位的结果,得到这两个结果之后,让其相加。直到进位全部为0即可
    2. 先算出无进位相加的结果,在算出进位的结果。
    3. 继续(无进位)“相加”两个结果,直至进位全部变为0.

image.png

代码实现

class Solution {
public:int getSum(int a, int b) {while(b != 0){int x = a ^ b; // 先算出⽆进位相加的结果//这里排除-1这种情况,-1二进制全是1unsigned int carry = (unsigned int)(a & b) << 1; // 算出进位  a = x;b = carry;}return a;}
};

只出现一次的数字II

只出现一次的数字II

题目解析

  • 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 **三次 。**请你找出并返回那个只出现了一次的元素。
  • 要求时间复杂度O(n),空间复杂度O(1)

算法原理

  1. 位图思想:
    1. 列出如下某一个比特位的所有情况image.png

    2. 将这些和相加后,%3,我们会发现一个规律:最终模完之后的结果和a(只出现一次的数)保持一致。image.png

    3. 将nums数组中所有的数的比特位第0位统统加起来%3,如果结果是0,不变,结果是1,修改位1;同理最终结果的倒数第二位也是如此,以此类推,直至将32位比特位全部修改完毕。

(设要找的数位 ret 。由于整个数组中,需要找的元素只出现了「⼀次」,其余的数都出现的「三次」,因此我们可以根据所有数的「某⼀个⽐特位」的总和 %3 的结果,快速定位到 ret 的「⼀个⽐特位上」的值是0 还是1 。这样,我们通过 ret 的每⼀个⽐特位上的值,就可以将ret 给还原出来 。)

我们如果想得到ret结果其中的某一位时,我们将nums中所有的数的这一位相加起来,再模上一个3(题中所要求的出现三次,如果是出现n次,就模上n),如果是0,就修改成0;如果是1,就修改成1。image.png

代码实现

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(int i = 0; i < 32; i++) // 依次去修改 ret 中的每⼀位{int sum = 0;for(int x : nums) // 计算nums中所有的数的第 i 位的和if(((x >> i) & 1) == 1)sum++;sum %= 3;if(sum == 1) ret |= 1 << i;}return ret;}
};

消失的两个数字

消失的两个数字

题目解析

  1. 用时间复杂度O(n),空间复杂度O(1)来解决。
  2. 数组区间n+2

image.png

算法原理

这道题其实是之前“丢失的数字”+“只出现一次的数字III

  1. 1~N这里相当于nums数组+a+b(缺失的两个数字——丢失的数字

image.png

  1. 将nums和1~N统称为一个整体,那么问题就转换为有两个数字出现了1次,剩下的一堆数字出现了2次(丢失的数字III

位运算思想:

  1. 将所有的数字异或在一起,记为tmp,因为出现两次的数字都异或被抵消了,所有tmp=a^b。接下来,我们将a、b两个数字分开
  2. 找到tmp中,比特位上为1的那一位。因为a和b这两个数字是不一样的,所以最终异或的结果是不等于0的。所以tmp中他的比特位上一定有一位上是1(记为x)。此时将刚刚所有的数字(nums和1~N)又可以划分为两大类,一类是x位上是0,一类上是x位上是1。在分别让这些数字和1、0进行异或,就能分离出a和b。image.png

代码实现

class Solution {
public:vector<int> missingTwo(vector<int>& nums) {// 1. 将所有的数异或在⼀起int tmp = 0;for(auto x : nums) tmp ^= x;for(int i = 1; i <= nums.size() + 2; i++) tmp ^= i;// 2. 找出 a,b 中⽐特位不同的那⼀位int diff = 0;while(1){//因为一定会有一个比特位上是1,所以一定回跳出这个死循环if(((tmp >> diff) & 1) == 1) break;else diff++;}// 3. 根据 diff 位的不同,将所有的数划分为两类来异或int a = 0, b = 0;for(int x : nums)if(((x >> diff) & 1) == 1) b ^= x;else a ^= x;for(int i = 1; i <= nums.size() + 2; i++)if(((i >> diff) & 1) == 1) b ^= i;else a ^= i;return {a,b};}
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java反序列化数据过滤

前言&#xff1a; 反序列化漏洞的危害稍微了解一点的都知道&#xff0c;如果能找到前端某处存在反序列化漏洞&#xff0c;那基本上距离拿下服务器仅一步之遥&#xff0c;这个时候我们可以通过继承ObjectInputFilter添加tFilter实现对所有反序列化类的校验&#xff0c;当然这个需…

嵌入式行业是否会面临中年危机?

今日话题&#xff1a;嵌入式行业是否会面临中年危机&#xff1f;事实上&#xff0c;无论你在哪个行业工作&#xff0c;都可能面临下岗风险。因此&#xff0c;我的建议是选择一个有前景、发展空间大的行业和方向&#xff0c;并不断提升自己的技能价值。为了帮助你在嵌入式领域取…

perl处理json的序列化和反序列化

perl可以使用JSON模块很方便的处理json的序列化和反序列化。先来一段简单的例子&#xff1a; #! /usr/bin/perl use v5.14; use JSON; use IO::File;my $info {id > 1024,desc > hello world,arry > [1, 2, 3, 4, 5],obj > {char > [ A, B, C ]} };say to_jso…

个人介绍以及毕业去向

CSDN陪伴我从大一到大四&#xff0c;后面也会接着用 写一点大学四年的总结 #总结#理工科#留学 211大学 弃保出国 智能科学与技术 均分88.9 EI论文一篇 数学竞赛和数学建模均为省二 大创评为国家级 全国大学生计算机设计大赛国家三等奖 百度Paddle、大疆RoboMaster、Phytium Te…

2 mysql主从复制配置

1、节点以及网络配置 前置条件&#xff1a; 已经在linux上安装好了一主一从或者一主多从的mysql 2、具体配置 主服务器 172.20.0.2 从服务器 172.20.0.3 首先主机mysql配置&#xff1a; 打开mysqld.cnf&#xff1a; 添加如下配置&#xff1a; # 主服务器ID 必须唯一 serve…

硕士论文写的重复率 PaperBERT

大家好&#xff0c;今天来聊聊硕士论文写的重复率&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 硕士论文写的重复率 1. 硕士论文的重要性 硕士论文是硕士阶段最重要的学术成果之一&#xff0c;它不仅…

基于ssm四六级报名与成绩查询系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对四六级报名信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性…

UE4 图片环形轮播 蓝图

【需求】 图片环形轮播 任意图片之间相互切换 切换图片所需时间均为1s 两个图片之间切换使用就近原则 播放丝滑无闪跳 【Actor的组成】 每个图片的轴心都在原点 【蓝图节点】

记录 | linux安装Manim

linux 安装 Manim sudo apt update sudo apt install build-essential python3-dev libcairo2-dev libpango1.0-dev ffmpeg sudo apt install xdg-utilsconda create manim_py39 python3.9 conda activate manim_py39pip install manim安装好环境后来测试一个例程&#xff0c;…

ECS省钱指南来啦!万字长文教你如何选择与业务形态最匹配的付费方式

为了更好的帮助用户在使用DevOps缩短开发周期、提升业务效率的同时&#xff0c;也能让业务保持稳定、安全、可靠&#xff0c;且低成本的持续运营&#xff0c;阿里云弹性计算团队独家出品的【弹性计算技术公开课_CloudOps云上运维季】正式启动。阿里云弹性计算内部13位产品&…

接口测试 — 1.接口和接口文档概念

1、接口的概念 接口又叫API&#xff0c;全称application programming interface&#xff1a;应用程序接口&#xff08;规范&#xff09;&#xff0c;也就是我们经常会听说Web接口&#xff0c;APP接口。 详细说明&#xff1a; APP是一种基于C/S架构的应用程序&#xff0c;如抖音…

MYSQL练题笔记-子查询-电影评分

一、题目相关内容 1&#xff09;相关的表 2&#xff09;题目 3&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 1.字典序是指从前到后比较两个字符串大小的方法。 首先比较第1个字符&#xff0c;如果不同则第1个字符较小的字符串更小&…

Retrofit嵌套请求与适配器

一、前言&#xff1a; 1. retrofit嵌套请求 在实际开发中&#xff0c;可能会存在&#xff1a;需要先请求A接口&#xff0c;在请求B接口的情况&#xff0c;比如进入“玩android”网页请求获取收藏文章列表&#xff0c;但是需要先登录拿到Cookie才能请求搜藏文章几口&am…

day01、什么是数据库系统?

数据库系统介绍 1.实例化与抽象化数据库系统2.从用户角度看数据库管理系统的功能2.1 数据库定义功能2.2 数据库操纵2.3 数据库控制2.4 数据库维护功能2.5 数据库语言与高级语言 3.从系统&#xff1a;数据库管理系统应具有什么功能 来源于战德臣的B站网课 1.实例化与抽象化数据库…

Node.js 事件循环简单介绍

1.简介 Node.js 事件循环是 Node.js 运行时环境中的一个核心机制&#xff0c;用于管理异步操作和回调函数的执行顺序。它基于事件驱动模型&#xff0c;通过事件循环来处理和派发事件&#xff0c;以及执行相应的回调函数。 Node.js 是单进程单线程应用程序&#xff0c;但是因为…

QT QIFW Windows下制作安装包(一)

一、概述 1、QIFW是一款基于QT框架开发的跨平台安装框架。QIFW是QT Installer FrameWork的缩写&#xff0c;支持Windows、Linux和macos等多种平台。QIFW可以帮助开发者创建自己的安装程序&#xff0c;将它们打包到通用的安装包中&#xff0c;并提供可视化的界面进行安装。 2…

mysql:用SHOW CREATE TABLE tbl_name查看创建表的SQL语句

https://dev.mysql.com/doc/refman/8.2/en/show-create-table.html 可以用SHOW CREATE TABLE tbl_name查看创建表的SQL语句。 例如&#xff0c;SHOW CREATE TABLE test_table;表示查询创建test_table表的SQL语句&#xff1a;

刘元昌:期待更多年轻人的第一杯精酿是失眠企鹅

12月7日下午&#xff0c;2023&#xff08;第十八届&#xff09;大河财富中国论坛盛大开启。作为先行论坛&#xff0c;2023新消费峰会火热开场。此次峰会以“提质新消费 释放新活力”为主题&#xff0c;集论坛、演绎、展示、互动为一体&#xff0c;把峰会变身“秀场”&#xff0…

腾讯-轻量应用服务器centos7中宝塔安装MySQL8.0出现内存不足

目录 前言 出现的问题: 解决方法&#xff1a; 编译安装&#xff1a; 极速安装 其他 我的其他博客 前言 说实话&#xff0c;本人也就是个穷学生买不起啥大的服务器啥的&#xff0c;整了个2核 2内存的服务器 用宝塔按mysql5.5是没问题的&#xff0c;一切换8.0就提醒内存不足…

UE5 - ArchvizExplorer与Map Border Collection结合 - 实现电子围栏效果

插件地址&#xff1a; https://www.unrealengine.com/marketplace/zh-CN/product/archviz-explorer https://www.unrealengine.com/marketplace/zh-CN/product/map-border-collection ArchvizExplorer扩展&#xff1a; https://download.csdn.net/download/qq_17523181/8843305…