剑指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的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer整数二进制 - 二进制加法 - JavaScript

剑指 Offer 65. 不用加减乘除做加法

剑指Offer之不用加减乘除做加法

剑指offer-47:不用加减乘除做加法

剑指offer:不用加减乘除法做加法

[LeetCode]剑指 Offer 65. 不用加减乘除做加法