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

我要成为算法高手-位运算篇

目录

  • 1. 判断字符是否唯一
  • 2. 消失的数字
  • 3. 两整数之和
  • 4. 只出现一次的数字II
  • 5. 消失的两个数字

前情提要:如果对一些常见的二进制位运算不熟悉,请看这篇文章: 常见的位运算

1. 判断字符是否唯一

面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)

在这里插入图片描述

思路:利用位图的思想,定义一个整数来模拟哈希表,根据每个比特位对应的值来映射字符

在这里插入图片描述

代码实现:

class Solution {public boolean isUnique(String astr) {        int BitMap = 0;int n = astr.length();if(n > 26){return false;}for(int i=0;i<n;i++) {char ch = astr.charAt(i);if(((BitMap>>(ch-'a')) & 1)==1){return false;} else {BitMap |= (1<<(ch-'a'));}}return true;}
}

2. 消失的数字

268. 丢失的数字 - 力扣(LeetCode)

在这里插入图片描述

思路:

在这里插入图片描述

代码实现:

class Solution {public int missingNumber(int[] nums) {// 异或运算int n = nums.length;int ret = 0;for(int i=0;i<=n;i++){ret^=i;}for (int i = 0; i < n; i++) {ret ^= nums[i];}return ret;// int n = nums.length;// //高斯求和// int sum = ((n)*(n+1))/2;// int numsSum = 0;// for(int i=0;i<nums.length;i++) {// numsSum += nums[i];// }// return sum - numsSum;}
}

3. 两整数之和

371. 两整数之和 - 力扣(LeetCode)

在这里插入图片描述

思路:

1、让这两个数a、b无进位相加(异或)所得结果x

2、a和b按位与所得结果carry

3、a=x,b=carry

4、a和b无进位相加(疑惑)

循环上面步骤直到b为0,此时相加结果是a

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

4. 只出现一次的数字II

137. 只出现一次的数字 II - 力扣(LeetCode)

在这里插入图片描述

思路:

在这里插入图片描述

定义一个变量ret,依次计算nums数组中第i位的和sum,接着让sum%3,根据结果对应的值修改ret对应比特位的值

class Solution {public int singleNumber(int[] nums) {int ret = 0;for(int i=0;i<32;i++){//依次修改ret中的每一位int sum = 0;for(int j=0;j<nums.length;j++){sum+= ((nums[j]>>i)&1);//计算第i位的和}sum%=3;if(sum==1){//修改第i位置的值ret |= (1<<i);}}return ret;}
}

5. 消失的两个数字

面试题 17.19. 消失的两个数字 - 力扣(LeetCode)

在这里插入图片描述

思路:

在这里插入图片描述

class Solution {public int[] missingTwo(int[] nums) {int len = nums.length;int N = len + 2;int ret = 0;for (int i = 0; i < nums.length; i++) {ret ^= nums[i];}for (int i = 1; i <= N; i++) {ret ^= i;}// ret为消失的两个数^的结果int lowBit = ret & (-ret);int[] ans = new int[2];ans[0] = 0;ans[1] = 0;for (int i = 1; i <= N; i++) {if ((i & lowBit) != 0) {ans[0] ^= i;} else {ans[1] ^= i;}}for (int i = 0; i < nums.length; i++) {if ((nums[i] & lowBit) != 0) {ans[0] ^= nums[i];} else {ans[1] ^= nums[i];}}return ans;}
}
http://www.lryc.cn/news/486825.html

相关文章:

  • 分布式IO模块:智慧楼宇的“智慧眼”与“智慧手”
  • 嵌入式八股文
  • 【IOS】Undefined symbol: _OBJC_CLASS_$_PAGFile
  • Spring Boot整合Tomcat底层源码分析
  • 工具类-基于 axios 的 http 请求工具 Request
  • WPF的基础控件详解
  • qt学习:截图+键盘事件
  • Scala中Arry
  • 学习threejs,使用AnimationMixer实现变形动画
  • 两大新兴开发语言大比拼:Move PK Rust
  • 基于一种基于OCR图像识别技术的发票采集管理系统及方法
  • 基于深度学习的车牌检测系统的设计与实现(安卓、YOLOV、CRNNLPRNet)+文档
  • JavaWeb——JS、Vue
  • Springboot 整合 Java DL4J 构建股票预测系统
  • ATmaga8单片机Pt100温度计源程序+Proteus仿真设计
  • FPGA通过MIPI CSI-2发送实时图像到RK3588,并HDMI显示
  • ELK8.15.4搭建开启安全认证
  • 原生微信小程序中封装一个模拟select 下拉框组件
  • 商品管理系统引领时尚零售智能化升级 降价商品量锐减30%
  • UE5 5.1.1创建C++项目,显示error C4668和error C4067
  • spring boot 集成 redis 实现缓存的完整的例子
  • json-bigint处理前端精度丢失问题
  • 【算法】【优选算法】前缀和(下)
  • Node.js 23 发布了!
  • 如何通过低代码逻辑编排实现业务流程自动化?
  • thinkphp6模板调用URL方法生成的链接异常
  • Spring Boot汽车资讯:科技驱动的未来
  • 嵌入式硬件电子电路设计(五)LDO低压差线性稳压器全面详解
  • qiankun主应用(vue2+element-ui)子应用(vue3+element-plus)不同版本element框架css样式相互影响的问题
  • resnet50,clip,Faiss+Flask简易图文搜索服务