剑指Offer整数二进制 - 二进制加法 - JavaScript
Posted YK菌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer整数二进制 - 二进制加法 - JavaScript相关的知识,希望对你有一定的参考价值。
嗨!~ 大家好,我是YK菌 🐷 ,一个微系前端 ✨,爱思考,爱总结,爱记录,爱分享 🏹,欢迎关注我呀 😘 ~ [微信公众号:
YK菌
]
今天继续来刷《剑指offer(专项突破版)》,原书是Java版本的,这里就是以javascript角度来看这些算法题。
剑指 Offer II 002. 二进制加法
本题与主站 67 题相同:67. 二进制求和
输入两个表示二进制的字符串,请计算它们的和,并以二进制字符串的形式输出。
例如,输入的二进制字符串分别是"11"和"10",则输出"101"。
分析
刚拿到题就想到将字符串转换成数字,然后进行加法操作,再转换成字符串即可。然而这样做可能会出现溢出的问题。所以应该使用字符串加法,只不过逻辑是二进制的。
关于字符串相加,我之前也写过博文可以参考~ 【LeetCode】字符串相加 - JavaScript的数组中unshift与push的效率对比 - 掘金 (juejin.cn)
题解
字符串相加(二进制版)
/**
* @param string a
* @param string b
* @return string
*/
var addBinary = function(a, b)
let result = []
let i = a.length - 1
let j = b.length - 1
let add = 0
// 注意几个细节:这里不仅判断了两个指针,还判断了是否还有进位
while(i >= 0 || j >= 0 || add !== 0)
// 注意几个细节:位数不够用0补齐
let x = a[i] ? +a[i] : 0
let y = b[j] ? +b[j] : 0
let res = x + y + add
result.push(res % 2)
// 注意几个细节:结果需要取整
add = ~~(res/2)
i--
j--
// 注意几个细节:最后数组需要反转一下
return result.reverse().join("")
;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JcXwObEA-1660371909934)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/673e88943d984709bb6979bcb2e34c39~tplv-k3u1fbpfcp-watermark.image?)]
其实这里与【LeetCode】字符串相加只是更改了两行代码:
result.push(res % 2)
add = ~~(res / 2)
所以,我们可以把题解拓展成任意进制的加法,如下所示:
/**
* @param string num1
* @param string num2
* @param string radix
* @return string
*/
var add = function(num1, num2, radix)
let result = []
let i = num1.length - 1
let j = num2.length - 1
let add = 0
while(i >= 0 || j >= 0 || add !== 0)
let x = num1[i] ? +num1[i] : 0
let y = num2[j] ? +num2[j] : 0
let res = x + y + add
result.push(res % radix)
add = ~~(res/radix)
i--
j--
return result.reverse().join("")
;
最后,欢迎关注我的专栏,和YK菌做好朋友
以上是关于剑指Offer整数二进制 - 二进制加法 - JavaScript的主要内容,如果未能解决你的问题,请参考以下文章