当前位置: 首页 > news >正文

【Java 优选算法】位运算

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



基础位运算符:

&: 有 0 就是 0

| : 有 1 就是 1

^ :相同为0,相异为1(无进位相加)

1.给一个数 n, 确定它的二进制表示中的第x位是 0 还是 1 . 使用公式(n >> x) & 1

2.将一个数 n 的二进制表示的 第x位 修改成 1. 将x位置 | 1,其余位置 | 0, 操作: n = n | (1 << x)

3.将一个数n 的二进制表示的第x 位修改成0. 将x位置 & 0,其余位置 & 1,操作: n = n&(~(1 << x) )

4.lowbit提取一个数(n)二进制表示中最右侧的1 . 让-n(让数n 按位取反再加1) & n

其中 -n 操作 本质是:将最左侧的1 的左边区域全部变成相反 

 

5.将一个数(n)二进制表示中的最左侧的1变成0. 使用 n & (n - 1) 

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

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

由第一个和第二个规律延申: 奇数个a相异或得到a, 偶数个a异或得到0

对应的题目练习

判定字符是否唯一

题目链接

解法

解法一: 利用哈希表 ,遍历字符串,每次将字符放进hash表中,判断是否重复. 时间复杂度和空间复杂度都是O(n),但其实new一个hash[26]就行

解法二: 位图, 用一个int 32位中的0~25位每一位表示26个字母,0代表没出现过,1代表出现了

优化:鸽巢原理(抽屉原理),如果字符串长度大于26个,那么一定是有重复的字母

代码

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

丢失的数字

题目链接

解法

解法一: 哈希集合,遍历数组,将出现的过的数字标记为1

解法二: 高斯求和, 求0到5的和 ,再减去nums的和,得出结果

 解法三: 异或运算规律, 将nums和0到5的所有数字都 异或 ,得到的结果就是 消失的数字

代码

//利用哈希集合
class Solution {public int missingNumber(int[] nums) {//利用集合Set<Integer> set = new HashSet<>();int n = nums.length;//先把原数组放到set里for(int x : nums) set.add(x);int ret = -1;//把完整数组的每一个元素放到set里判断是否包含,即可查出缺失的数字for(int i = 0; i <= n; i++){if(!set.contains(i)){ret = i;break;}}return ret;}
}//利用高斯求和
class Solution {public int missingNumber(int[] nums) {int n = nums.length;int ret = (n * (n + 1)) / 2;for(int i : nums) ret -= i;return ret;}
}//利用异或
class Solution {public int missingNumber(int[] nums) {int ret = 0;for(int x : nums){ret ^= x;}        for(int i = 0; i <= nums.length; i++){ret ^= i;           }return ret;}
}

两整数之和

题目链接

解法

利用位运算, 将要计算的两个数的和拆分为 两部分: 无进位和 以及 进位和 

  1. 无进位相加 ,"异或"运算:, 即a ^ b,
  2. 进位操作可以使用 "与"运算后再左移一位用符号表示: (a & b) << 1

步骤1得到的数又重新记为 a, 步骤2得到得到的数重新记为b,重复以上操作,最后直到b=0即可得出结果

画图举例

代码

class Solution {public int getSum(int a, int b) {while(b != 0){int tmp = a;a ^= b;//先算出无进位相加b = (b & tmp)<<1;//算出进位相加}return a;}
}

只出现一次的数字||

题目链接

解法

题目要求实现: 线性时间复杂度 即O(n),常数级空间复杂度 即O(n)

 数组中所有数的比特位 相加可以分为4种情况,如下图

将每一个数的 每一位比特位分别对应相加再%3得到的就是 只出现过一次的数a

画图举例

代码

class Solution {public int singleNumber(int[] nums) {int ret = 0;for(int i = 0; i < 32; i++){//依次修改ret中的每一个比特位int sum = 0;//统计nums中所有数的第i为的和for(int x : nums){if(((x >> i) & 1) == 1){sum++;}} sum %= 3;//超时sum对应i位置ret中比特位的数,//如果sum是1,就将ret的i位置修改为1,0则不用管if(sum == 1) ret |= 1 << i;}return ret;}
}

消失的两个数字

题目链接

解法 

nums完整数组1~n所有数字都异或 得到的结果就是a^b(必定不为0),结果就是将a^b分开得到a和b,问题就转变成了: 已知a^b,如何将a和b分开

找到a^b相异的部分dif(即a^b的比特位第一次出现1的位置),将所有的数通过 dif 分类开,再 异或,就可以得到a和b

代码

class Solution {public int[] missingTwo(int[] nums) {int tmp = 0;for(int x: nums) tmp ^= x;for(int i = 1;i <= nums.length + 2;i++) tmp ^= i;//找出a,b两个数比特位不同的第一位,即第一次出现1的位置int dif= 0;while(true){if(((tmp >> dif) & 1) == 1) break;else dif++;}int[] ret = new int[2];for(int x: nums){if(((x >> dif) & 1) == 1) ret[1] ^= x;else ret[0] ^= x; }//将所有的数按照dif位不同,分两类进行异或for(int i =1 ;i <= nums.length + 2;i++){if(((i >> dif) & 1) == 1) ret[1] ^= i;else ret[0] ^= i;}return ret;}
}

相关文章:

【Java 优选算法】位运算

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 基础位运算符: &: 有 0 就是 0 | : 有 1 就是 1 ^ :相同为0,相异为1(无进位相加) 1.给一个数 n, 确定它的二进制表示中的第x位是 0 还是 1 . 使用公式(n >> x) &…...

细分数字货币钱包的不同种类

文章目录 一、中心化钱包1.1 中心化钱包架构1.2 中心化钱包业务细节流程 二、去中心化钱包(HD 钱包)2.1 去中心化钱包架构2.2 去中心化钱包细节业务流程 三、硬件钱包3.1 硬件钱包架构3.2 硬件钱包细节业务流程 四、MPC 托管钱包五、多签钱包 中心化钱包 &#xff1a;钱包私钥一…...

Nginx Embedded Variables 嵌入式变量解析(4)

Nginx Embedded Variables 嵌入式变量解析(4) 相关链接 nginx 嵌入式变量解析目录nginx 嵌入式变量全目录nginx 指令模块目录nginx 指令全目录 一、目录 1.1 变量目录 1.1.24 ngx_stream_core_module $binary_remote_addr $bytes_received $bytes_sent $connection $hos…...

ARM64 Trust Firmware [四]

完成第二阶段 BL2 的操作后就加载并进入 BL31&#xff0c;BL31 位于 DRAM 中&#xff0c;EL3 模式。除了做架构初始化和平台初始化外&#xff0c;还做了如下工作&#xff1a; 基本硬件初始化&#xff0c;比如 GIC&#xff0c;串口&#xff0c;timer 等&#xff1b;PSCI 服务的…...

SQLMesh 系列教程6- 详解 Python 模型

本文将介绍 SQLMesh 的 Python 模型&#xff0c;探讨其定义、优势及在企业业务场景中的应用。SQLMesh 不仅支持 SQL 模型&#xff0c;还允许通过 Python 编写数据模型&#xff0c;提供更高的灵活性和可编程性。我们将通过一个电商平台的实例&#xff0c;展示如何使用 Python 模…...

聊一聊vue如何实现角色权限的控制的

大家好&#xff0c;我是G探险者。 关于角色与权限控制&#xff0c;通常是分为两大类&#xff1a;一种是菜单权限&#xff1b;一种是操作权限。 菜单权限是指&#xff0c;每个角色对应着可以看到哪些菜单&#xff0c;至于每个菜单里面的每个按钮&#xff0c;比如增删改查等等这类…...

Python连接MySQL数据库图文教程,Python连接数据库MySQL入门教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. 环境准备1.1安装 Python1.2选择开发环境1.3安装 MySQL 数据库1.4 安装 pymysql 库 2. 连接数据库3. 数据库基本操作3.1 创建数据库3.2 创建表3.3 插入数据3.…...

懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制)

1.合集懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制)&#xff1a;https://www.bilibili.com/video/BV1M6rdYEEog/ 备注&#xff1a; 1.本地离线卡密采用最安全的非对称加解密技术&#xff0c;设备id采用最安全多重混合加密不可逆技术生成&…...

天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制

天 锐 蓝盾终端安全管理系统以终端安全为基石&#xff0c;深度融合安全、管理与维护三大要素&#xff0c;通过对桌面终端系统的精准把控&#xff0c;助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化&#xff0c;有效破解终端安全管理难题&#xf…...

LeetCode 2595.奇偶位数:位运算

【LetMeFly】2595.奇偶位数&#xff1a;位运算 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-even-and-odd-bits/ 给你一个 正 整数 n 。 用 even 表示在 n 的二进制形式&#xff08;下标从 0 开始&#xff09;中值为 1 的偶数下标的个数。 用 odd 表示…...

一周学会Flask3 Python Web开发-response响应格式

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在HTTP响应中&#xff0c;数据可以通过多种格式传输。大多数情况下&#xff0c;我们会使用HTML格式&#xff0c;这也是Flask中…...

uni-app开发app时 使用uni.chooseLocation遇到的问题

问题一&#xff1a;不显示 问题二&#xff1a;选择地址列表一直在加载中 因为 uni-app 接口文档 中已经说明&#xff0c;使用腾讯的话需要开启云服务&#xff0c;具体可看官网&#xff0c;这就是为什么使用时直接不显示的原因&#xff0c;所以我使用的高德&#xff0c;但又出现…...

Android Hal AIDL 简介 (一)

Android 接口定义语言 (AIDL) 是一款可供用户用来抽象化 IPC 的工具。 以在 .aidl 文件中指定的接口为例,各种构建系统都会使用 aidl 二进制文件构造 C++ 或 Java 绑定,以便跨进程使用该接口(无论其运行时环境或位数如何)。 AIDL 可以在 Android 中的任何进程之间使用:在…...

鸿蒙初学者学习手册(HarmonyOSNext_API14)_组件截图(@ohos.arkui.componentSnapshot (组件截图) )

前言&#xff1a; 这个模块可以截取组件的图片&#xff0c;无论组件是否已加载。截图只能拍到组件本身的大小区域。 如果组件或其子组件画得超出了自己的区域&#xff0c;超出的部分不会出现在截图中。截图不会拍到与当前组件平级的&#xff08;兄弟&#xff09;组件。 模块简…...

华为昇腾910b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…...

[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植

最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台&#xff0c;现在已经移植了&#xff0c;尝试了下效果&#xff0c;降噪效果很显著&#xff0c;噪声带被显著抑制了 降噪前&#xff1a; 降噪后&#xff1a;...

golang内存泄漏

golang也用了好几年了&#xff0c;趁着有空 整理归纳下&#xff0c;以后忘了好看下 一般认为 Go 10次内存泄漏&#xff0c;8次goroutine泄漏&#xff0c;1次是真正内存泄漏&#xff0c;还有1次是cgo导致的内存泄漏 1:环境 go1.20 win10 2:goroutine泄漏 单个Goroutine占用内存&…...

安科瑞能源物联网平台助力企业实现绿色低碳转型

安科瑞顾强 随着全球能源结构的转型和“双碳”目标的推进&#xff0c;能源管理正朝着智能化、数字化的方向快速发展。安科瑞电气股份有限公司推出的微电网智慧能源管理平台&#xff08;EMS 3.0&#xff09;&#xff0c;正是这一趋势下的创新解决方案。该平台集成了物联网&…...

Android Http-server 本地 web 服务

时间&#xff1a;2025年2月16日 地点&#xff1a;深圳.前海湾 需求 我们都知道 webview 可加载 URI&#xff0c;他有自己的协议 scheme&#xff1a; content:// 标识数据由 Content Provider 管理file:// 本地文件 http:// 网络资源 特别的&#xff0c;如果你想直接…...

腾讯的webUI怎样实现deepseek外部调用 ; 腾讯云通过API怎样调用deepseek

腾讯的webUI怎样实现deepseek外部调用 目录 腾讯的webUI怎样实现deepseek外部调用腾讯云通过API怎样调用deepseekhtml方式curl方式python方式腾讯云通过API怎样调用deepseek 重点说明:不需要SK,仅仅使用ip和端口号 html方式 <!DOCTYPE html> <html lang="e…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...