算法篇:位运算异或的使用(一)
时间:2022-07-25
本文章向大家介绍算法篇:位运算异或的使用(一),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法:
在位运算中,运用最多的便是异或操作^,规则如下所示:
1.a^a = 0 ,a^0 = a,
2.a^b^a= a^a^b = 0^b = b
备注:下面的两个题目是单纯使用异或操作的题目,一种是最基本的异或操作,
一种是稍作转换就可以完成的变形题目。
题目1: 异或的基本使用
https://leetcode-cn.com/problems/single-number/
代码实现:
func singleNumber(nums []int) int {
if len(nums) == 0 {
return 0
}
res := 0
for _,v := range nums{
res ^= v
}
return res
}
// 算法:
// 利用位运算,异或的使用,a^a = 0 ,a^0 = a,
// 因为题目是两个数,和一个数,属于^的完美使用范畴,
// 由公式:a^b^a= a^a^b = 0^b = b,可以直接将代码取异或操作,
//结果就是那个个数为1的数
执行结果:
题目2: 异或的变形题目
https://leetcode-cn.com/problems/single-number-iii/
代码实现:
func singleNumber(nums []int) []int {
if len(nums) == 0 {
return nil
}
// step1:抵消掉数量为2的数
tmp:= 0
for _,v:=range nums{
tmp ^= v
}
// step2:找出来第一个为1的bit位
i:=0
for {
n := 1<<i
if tmp&n != 0 {
break
}
i++
}
// step3:按照bit=1来将数组分成两组,然后分别计算这两组的异或值,也就是这两个数
a,b := 0,0
test := 1<<i
for _,n := range nums {
if n & test == 0{
a^=n
} else {
b^=n
}
}
return []int{a,b}
}
// 算法:属于异或的延伸题目
// 因为有两个数字个数是1,其他都是两个,所以要使用异或,
// 大体思路是将包含两个一个的数组变成2个分别包含一个个数是1的数组里面,将题目转换成题目1的做法
// 算法分为三步:
// step1:通过异或,最终获取这两个数字的异或结果a^b=0xiiiii,
// 这里只要是bit!=0,就说明这一个bit位在a,b两个数中不相同,我们就从低位开始找,找到第一个为1的bit位即可。
// step2:找到这个bit位置
// step3:遍历数组,将数组中该bit==1的元素放入数组A,bit==0的放入数组B,
// 分别计算A,B就可以得到这两个数。
执行结果:
- 碎片化 | 第七阶段-10-session共享解决方案-视频
- CSS选择器是如何确定优先级的?
- JS中控制好this关键字的指向
- 碎片化 | 第四阶段-46-值栈valueStack介绍和原理-视频
- Laravel中运行Gulp任务的利器(一) —— Laravel Elixir简介及入门教程
- 碎片化 | 第四阶段-52-Hibernate特性-视频
- 碎片化 | 第四阶段-53-hibernate持久化session问题解决-视频
- 入门webpack(下)
- 巨头们关注的实时Web:发展与相关技术
- 碎片化 | 第四阶段-54-hibernate-spring整合流程-视频
- OpenDaylight Lithium版本简单应用及流表操作指南
- 碎片化 | 第四阶段-55-OpenSessionInViewFilter组件配置解决session问题-视频
- 入门Webpack(上)
- 碎片化 | 第四阶段-56-ManyToOne和OneToMany映射关系-视频
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go语言入门(九) 文件操作
- zookeeper完整详细版
- redis学习(十九)
- Android开发6年,互联网寒冬公司倒闭后,耗时3个月北上广求职,终拿到头条Offer!
- 直播软件开发如何使用FFMPEG推流并保存在本地
- react-router学习笔记
- 尤大 3 天前发在 GitHub 上的 vue-lit 是啥?
- BFE.dev前端刷题 23. 实现一个sum()方法
- 彻底深刻理解js原型链之prototype,proto以及constructor(一)
- SAP Spartacus取cart的HTTP请求
- 记一次Netty连接池FixedChannelPool连接未释放问题的排查总结
- 神经网络中的蒸馏技术,从Softmax开始说起
- NullInjectorError R3InjectorError(AppModule)[StoreFeatureModule]
- Angular module加载的原理研究
- NullInjectorError No provider for EffectsRootModule!