算法篇:位运算进阶(二)
时间:2022-07-25
本文章向大家介绍算法篇:位运算进阶(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法
转换成前面算法篇:位运算异或的使用(一)中,两位相同的数异或为0,转换成3位数的"异或"操作位0,也就是说我们需要实现同一个bit位的3个1,操作为0就可以,将问题转换为对如何实现同一bit位的三个数的操作a?b?c =0的运算。
因为两位数的异或操作,是同一个bit位的两个数的加法,忽略进位的情况,换种说法就是两数相加对2取余数。所以三个相同的数的a?b?c = 0的操作就变成了,三位数操作对3取余了。
同样的道理,4位数,n位数都可以采用这一个算法来实现。
题目:只出现一次的数字 II
https://leetcode-cn.com/problems/single-number-ii/
算法1:数学公式
这个题目可以转换成下面的公式:2c = 3(a+b+c)-sum,
这里的a,b,c是数组中出现的元素,c是出现了一次的数,a,b都是出现了3次的数。
sum表示的是:数组里面所有数的和。
备注:同样的算法,也适合数组里面有n次重复的数组,和1个不重复的数 ,公式为:n(a+b+c)-sum = (n-1)c
代码实现:
func singleNumber(nums []int) int {
m := make(map[int]int)
s1,s2 := 0,0
for _,n:=range nums {
_,ok := m[n]
if !ok {
m[n] = n
}
s1 += n
}
for _,v:= range m {
s2 += v
}
res := (3*s2-s1)/2
return res
}
// 算法:假设3个a,b,一个c: 公式: 3(a+b+c) - sum = 2c
执行结果:
算法2: 采用位运算
指导思路是:转换成前面算法篇:位运算异或的使用(一)中,两位相同的数异或为0,转换成3位数的"异或"操作位0,也就是说我们需要实现同一个bit位的3个1,操作为0就可以,将问题转换为对如何实现同一bit位的三个数的操作a?b?c =0的运算。
因为两位数的操作采用的是异或,也就是 :
1^1 = 0
1^0 = 1
0^1 = 1
0^0 =0
这其实是同一个bit位的两个数的加法,忽略进位的情况,换种说法就是两数相加对2取余数。
参考:算法篇:位运算基本操作
所以三个相同的数的a?b?c = 0的操作就变成了,三位数操作对3取余了。
代码实现:
func singleNumber(nums []int) int {
num,res := 0,0
for i:=0;i<64;i++ {
// 每一bit位都需要计算,所以这里要做清0处理
num = 0
for _, n := range nums {
// 通过右移,来计算num的数量
num += (n>>i)&1
}
// 将计算结果还原到对应的bit位
res |= (num)%3<<i
}
return res
}
执行结果:
- 世界首条光伏高速公路:能发电,能充电,能化雪
- WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
- 简练的视图模型 ViewModel
- 提供智能服务?先迈过数字信任这个坎
- 《天弋夺宝》—01飞船的控制
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出
- 核心代码(未注释)
- 从科研角度谈“如何实现基于机器学习的智能运维”
- 用后台代码创建Storyboard
- 十分钟掌握微信小程序开发:高仿电商产品分类功能
- WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务
- DoubleAnimation方法
- 已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html
- 有趣 不用js也能创建silverlight
- 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 数组属性和方法
- Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load
- 如何从xml文件创建R语言数据框dataframe
- Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV) 模型
- 如何从xml文件创建R语言数据框dataframe
- R语言POT超阈值模型和极值理论EVT分析
- R语言使用灰色关联分析(Grey Relation Analysis,GRA)中国经济社会发展指标
- R语言中的模拟过程和离散化:泊松过程和维纳过程
- R语言Lee-Carter模型对年死亡率建模预测预期寿命
- R语言有极值(EVT)依赖结构的马尔可夫链(MC)对洪水极值分析
- RxSwift 封装 CoreBluetooth(一) 配置
- Golang 操作Excel文件
- 腾讯云TKE-搭建prometheus监控(一)
- Android开发中ProgressDialog简单用法示例
- Android实现拍照及图片裁剪(6.0以上权限处理及7.0以上文件管理)
- Android仿微信调用第三方地图应用导航(高德、百度、腾讯)