【剑指Offer】整数(二)二进制 - 二进制加法 - JavaScript

187 阅读2分钟

嗨!~ 大家好,我是YK菌 🐷 ,一个微系前端 ✨,爱思考,爱总结,爱记录,爱分享 🏹,欢迎关注我呀 😘 ~ [微信公众号:YK菌]

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

从今天继续来刷《剑指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("")
};

image.png

其实这里与【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菌做好朋友