位运算算法

文章目录

  • 预备知识
  • 判断字符是否唯⼀
  • 丢失的数字
  • 两整数之和
  • 只出现⼀次的数字
  • 只出现⼀次的数字II
  • 消失的两个数字

预备知识

给一个数n,确定它的二进制表示中的第x位是0还是1

(n>>(x-1)) & 1 == 1
true是1,false是0

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

n |= (1<<(x-1))

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

n &= (~(1<<(x-1)))

提取一个数n二进制表示中最右侧的1

n & -n
-n 相比 n 是将最右侧的1左边的区域全部取反

干掉一个数n二进制表示中最右侧的1

n = n & (n-1)
n-1是将最右侧的1右边的区域(包含1)全部取反

异或(^)运算的运算律

1.两个相同的数异或的结果一定为0。(a^a== 0)
2.任何数与0异或都等于它自己。(a^0== a)
3.异或满足交换律;

判断字符是否唯⼀

算法思路(位图的思想):

利用「位图」的思想,每⼀个「比特位」代表⼀个字符,⼀个 int 类型的变量有 32 位足够表示所有的小写字⺟。比特位里面如果是 0 ,表示这个字符没有出现过。比特位里面的值是 1 表示该字符出现过。
那么我们就可以用⼀个「整数」来充当「哈希表」。

class Solution {public boolean isUnique(String astr) {//利用鸽巢原理来做优化if(astr.length() > 26) return false;int bitMap = 0;for(int i = 0; i < astr.length(); i++) {int x = astr.charAt(i) - 'a';//先判断字符是否在位图中if(((bitMap >> x) & 1) == 1) return false;//把当前字符加入到位图中bitMap |= 1 << x;}return true;}
}

丢失的数字

算法思路:
可以用哈希表和高斯求和, 我们这里用位运算

如果我们把数组中的数,以及 [0, n] 中的数全部「异或」在⼀起,那么根据「异或」运算的两个相同的数异或的结果一定为0,最终的异或结果就是缺失的数

class Solution {public int missingNumber(int[] nums) {int ret = 0;for(int i = 0; i < nums.length; i++)   ret ^= nums[i];for(int i = 0; i <= nums.length; i++) ret ^= i;return ret;}
}

两整数之和

算法思路:

  • 异或 ^ 运算本质是「⽆进位加法」;
  • 按位与 & 操作能够得到「进位」;
  • 然后⼀直循环,直到「进位」变成 0 为⽌。
class Solution {public int getSum(int a, int b) {while(b != 0) {int tmp = (a & b) << 1;//需要进位a ^= b;//无需进位b = tmp;}return a;}
}

递归:

class Solution {public int getSum(int a, int b) {if(b == 0) return a;return getSum(a^b, (a&b)<<1);}
}

只出现⼀次的数字

class Solution {public int singleNumber(int[] nums) {int ret = 0;for(int x: nums) ret ^= x;return ret;}
}

只出现⼀次的数字II

算法思路(比特位计数):

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

class Solution {public int singleNumber(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, 1的那个比特位不相同,所以我们可以把它们分成两组

过程:
1.全部异或在一起
2.找出两个数不同的比特位
3.分组异或

class Solution {public int[] missingTwo(int[] nums) {//1.先把所有数异或在一起int tmp = 0;for(int x: nums) tmp ^= x;for(int i = 1; i <= nums.length + 2; i++) tmp ^= i;//2.找出两个数不同的比特位int diff = 0;while(true) {if(((tmp >> diff) & 1) == 1) break;else diff++;}//3.将数组的数和[1, n + 2] 区间内所有数按照diff位不同,分两类异或int[] ret = new int[2];for(int x: nums) {if(((x >> diff) & 1) == 1) ret[1] ^= x;else ret[0] ^= x;}for(int i = 1; i <= nums.length + 2; i++) {if(((i >> diff) & 1) == 1) ret[1] ^= i;else ret[0] ^= i;}return ret;}
}

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

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

相关文章

vmare17 安装不可启动的iso镜像系统

由于要测试一个软件&#xff0c;要安装一个Windows11_InsiderPreview_Client_x64_zh-cn_26058.iso 于是在虚拟机里捣鼓一下。但是这个iso好像不能直接启动 这样就无法直接安装了&#xff0c;怎么办呢&#xff0c;可以先用个pe系统引导进去&#xff0c;再在PE系统里安装这个iso…

实验4 词向量训练

必做题: 数据准备:数据集包含100个文件,每个文件里面有多个从维基百科上爬取的内容,每一条以字典形式保存,分为id,url,title,text四个字段,使用text字段的文本训练词向量。读取‘text’字段的文本,并使用jieba进行分词。使用Gensim工具训练词向量,训练方法为Skip-gr…

【链表】Leetcode 23. 合并 K 个升序链表【困难】

合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1…

【免费】如何考取《鲸鸿动能广告初级优化师》认证(详细教程)

鲸鸿动能广告初级优化师认证考试PC网址 初级&#xff1a;鲸鸿动能广告初级优化师认证-华为开发者学堂 (huawei.com) 注&#xff1a;免费认证&#xff0c;里面包含免费的课程&#xff0c;浏览器用Edge。 文章目录 鲸鸿动能广告初级优化师认证考试网址 前言 一、备考流程 二…

元素和节点

节点操作和事件 今日目标&#xff1a; 节点的概念和分类 节点的创建&#xff0c;插入&#xff0c;替换&#xff0c;删除操作 事件三要素 常用事件类型 0.回顾 # 1. 获取元素的尺寸 offset一套 dom.offsetWidth: 内容 内边距 边框 dom.offsetHeightclient一套 dom.clie…

软考 网络工程师 每日学习打卡 2024/3/21

学习内容 第8章 网络安全 本章主要讲解网络安全方面的基础知识和应用技术。针对考试应该掌握诸如数据加密、报文认 证、数字签名等基本理论&#xff0c;在此基础上深入理解网络安全协议的工作原理&#xff0c;并能够针对具体的 网络系统设计和实现简单的安全解决方案。 本章共有…

C语言经典例题(5) --- 交换数组、统计二进制、交换变量、菱形、字符串左旋

文章目录 1.交换数组2.统计二进制中1的个数3.交换两个变量(不创建临时变量)4.打印菱形5.字符串左旋 1.交换数组 将数组A中的内容和数组B中的内容进行交换。(数组大小一样) #include <stdio.h>void swap(int arr1[],int arr2[], int sz) {int tmp 0;for (int i 0;i &l…

python云上水果超市的设计与实现flask-django-php-nodejs

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对云上水果超市进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套云上水果超市&#xff0c;帮助商家进行商品信…

如何为您的网站压缩图像

今天碰到一个客户反馈&#xff0c;他在hostease购买了虚拟主机&#xff0c;创建的WordPress站点图片比较多&#xff0c;后来访问网站&#xff0c;页面上大量的图片加载时间较长&#xff0c;咨询网站图像如何压缩。我们为用户提供网站图像压缩&#xff0c;用户很快完成了设置。在…

【Pt】新建项目时的设置

新建项目时需要在如下界面做一些设置。 一、模板与文件 模板通常选择“PBR - Metallic Roughness Alpha-blend” 文件可以选择fbx&#xff0c;abc&#xff0c;obj等格式的三维模型文件 二、项目设置 2.1 文件分辨率 指的是在软件中的预览效果&#xff0c;分辨率越高预览效果…

使用npm创建一个全局的cli命令,就像vue-cli一样

我们用过vue-cli等工具包&#xff0c;全局安装之后&#xff0c;我们可以直接使用vue create等命令&#xff0c;实际上能够这样使用的原因&#xff0c;就是使用了package.json里面的bin字段注册命令。接下来就以一个脚本文件为例子为大家演示一下bin是如何发挥作用的。 创建项目…

跳过mysql权限验证来修改密码-GPT纯享版

1.打开 MySQL 的配置文件&#xff0c;通常是 my.ini 或 my.cnf。 2.找到 [mysqld] 部分&#xff0c;如果没有则添加。 3.在 [mysqld] 部分中添加一行&#xff1a;skip-grant-tables&#xff0c;这个选项告诉 MySQL 服务器跳过权限验证&#xff0c;允许任何用户连接而不需要密码…

OpenCV基于阈值的分割技术详细介绍

OpenCV 提供了基于阈值的分割技术&#xff0c;这是一种简单且常用的图像分割方法&#xff0c;其基本思想是根据像素的灰度值将图像分为不同的区域。下面详细介绍了 OpenCV 中基于阈值的分割技术&#xff1a; 全局阈值分割&#xff08;Global Thresholding&#xff09;&#xff…

java数据结构与算法基础-----排序------堆排序

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 堆排序是利用堆&#xff08;数据结构&#xff09;设计的排序算法…

基于SSM+Jsp+Mysql的KTV点歌系统

基于SSMJspMysql的KTV点歌系统 基于SSMJspMysql的KTV点歌系统的设计与实现 开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工…

SRC中的一些信息收集姿势

前言 前前后后挖了四个月的EDUSRC&#xff0c;顺利从路人甲升到了网络安全专家&#xff0c;从提交的内容来看大部分还是以中低危为主&#xff0c;主打的就是弱口令和未授权。 在这过程中还是比较浮躁的&#xff0c;因此接下来的时间还是要好好沉淀一下自身的技术&#xff0c;学…

undo log

从这篇「执行一条 SQL 查询语句&#xff0c;期间发生了什么&#xff1f; (opens new window)」中&#xff0c;我们知道了一条查询语句经历的过程&#xff0c;这属于「读」一条记录的过程&#xff0c;如下图&#xff1a; 那么&#xff0c;执行一条 update 语句&#xff0c;期间发…

Unix环境高级编程-学习-07-多线程之互斥锁

目录 一、自由抒发 二、函数介绍 1、pthread_mutex_init &#xff08;1&#xff09;声明 &#xff08;2&#xff09;作用 &#xff08;3&#xff09;参数 &#xff08;4&#xff09;返回值 &#xff08;5&#xff09;注意点 &#xff08;6&#xff09;宏 2、pthread_mut…

【大数据】四、HDFS 基础操作

IDE 连接 在本地电脑上解压 hadoop.tar.gz&#xff0c;配置环境变量 之后 去github 上 把 winutil.exe 和 hadoop.dll 下载到 hadoop 的bin 文件夹下 再修改 etc/hadoop-env.cmd 中的 JDK 路径 我们使用 IDEA 打开一个 JAVA Maven项目&#xff0c;进行测试 注意&#xff0…

vue3 报错 require is not defined

问题 require is not defined 原因 vite 不支持require的用法&#xff0c; webpack是支持的 解决 方法一&#xff1a; 更改vite使用语法 vite官网 方法二 安装转换插件vite-plugin-require-transform 仓库地址 参考 关于Vite不能使用require问题 方法二Vite 踩坑 —— …