67. Add Binary

字数 273阅读 371

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100".

将两个字符串进行二进制加减法。
思想是从两个字符串的末尾开始相加,将本位结果记在结果字符串中,进位记在一个变量中。
我一开始的实现是这样的:

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
    var num1 = a.length-1;
    var num2 = b.length-1;
    var bit = 0;
    if (num1>=num2) {
        var temp = "";
        while (num2>=0) {
            var result = parseInt(a[num1])+parseInt(b[num2])+bit;
            if (result === 0) {
                bit = 0;
                temp = '0' + temp;
            } else if (result === 1) {
                bit = 0;
                temp = '1' + temp;
            } else if (result === 2) {
                bit = 1;
                temp = '0' + temp;
            } else {
                bit = 1;
                temp = '1' + temp;
            }
            num1--;
            num2--;
        }
        while (num1>=0) {
            var result = parseInt(a[num1])+bit;
            if (result === 1) {
                bit = 0;
                temp = '1' + temp;
            } else if (result === 0) {
                bit = 0;
                temp = '0' + temp;
            } else  {
                bit = 1;
                temp = '0' + temp;
            } 
            num1--;
        }
        if (bit===1) 
            temp = '1' + temp;
        return temp;
    } else {
        return addBinary(b,a);
    }
};

简单粗暴的办法。
后来在网上看到了别人的解法虽然思想是一样的,人家的就优雅的多:

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
    var s = "";
    var c = 0;
    var i = a.length - 1;
    var j = b.length - 1;
    while(i >= 0 || j >= 0 || c == 1)
    {
        c += i >= 0 ? parseInt(a[i --]) : 0;
        c += j >= 0 ? parseInt(b[j --]) : 0;
        s = (c % 2) + s;
        c = parseInt(c / 2);
    }
    return s;
};

首先,优雅的解决字符串长短的问题,不管i和j谁先到头,到头了就不加了就好了;
其次,使用一个变量c同时解决本位结果和本位进位,c本身有4种可能的值:0,1,2,3,c%2就是本位结果,c/2就是本位进位;
当i,j都进行完时,如果c还等于1,那就意味着要多一个最高位,while循环同时也能处理这种情况。

推荐阅读更多精彩内容