Add Binary

https://oj.leetcode.com/problems/add-binary/

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

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

解题思路:

这题比较基础,但想写对也不太容易。

首先知道的一点,不能将数字直接Integer.parseInt()成整数,相加,然后再转为二进制的string,这样会溢出。当然,你可以借用BigInteger(value, radix)这样的现成的类,不过就失去了本题的意义。这个链接里有一个这样的解法。

https://oj.leetcode.com/discuss/20559/java-one-line-solution-using-biginteger

我们考虑一般的解法。一个游标,从a和b的最后一位往前遍历,同位转化为int相加,这个结果还要加上前面一位的进位extra。这个值%2就是该位的值,/2是进位的值。如此往复,直到首先到达a或b的开头,即较短的那个。

然后把多出的一段拿出来,加上extra,接在上面结果的前面,就可以了。这时一个递归的调用。递归结束的条件是,addBinary(String a, String b),这里a和b的长度相等。可能是一开始就相等,也可能是a多出来一段,这时b.length()==0,那么也就是extra往前递归一直加到a.length()也是0,也就是a递归加结束了。

最后不要忘记如果extra还有1,一定要加上去。0就不要加了。

public class Solution {

    public String addBinary(String a, String b) {

        int minLength = Math.min(a.length(), b.length());

        String result = "";

        //记录进位

        int extra = 0;

        

        //a和b的index要从后向前加

        for(int i = 0; i < minLength; i++){

            int sum = ((a.charAt(a.length() - 1 - i) - '0') + (b.charAt(b.length() - 1 - i) - '0') + extra) % 2;

            result = String.valueOf(sum) + result;

            extra = ((a.charAt(a.length() - 1 - i) - '0') + (b.charAt(b.length() - 1 - i) - '0') + extra) / 2;

        }

        

        //进位加上a或b较长的前面的一段

        if(a.length() < b.length()){

            result = addBinary(b.substring(0, b.length() - a.length()), String.valueOf(extra)) + result;

        }else if(a.length() > b.length()){

            result = addBinary(a.substring(0, a.length() - b.length()), String.valueOf(extra)) + result;

        }else{

            //a和b长度相等,也可能是上面递归调用到第一位,加上进位,如果进位为0不加,否则就会出现01111这样的情况

            if(extra == 1){

                result = String.valueOf(extra) + result;

            }

        }

        return result;

    }

}

上面是一个AC的递归解法。这道题还用了递归,实在是不应该,想想一定有普通的循环,线性的解法。

为什么循环一定要到a与b较短的那个就结束了?怕越界。为什么怕越界?越界不就是在较短的那个字符串前面加上n个0吗?思路一下子出来,这样循环终止的条件就是a和b中较长的长度了。而且可以以一个思路直接循环到结束。代码如下。

public class Solution {

    public String addBinary(String a, String b) {

        int maxLength = Math.max(a.length(), b.length());

        String result = "";

        //记录进位

        int extra = 0;

        

        //a和b的index要从后向前加

        for(int i = 0; i < maxLength; i++){

            char aChar = '0';

            char bChar = '0';

            if(a.length() - 1 - i >= 0){

                aChar = a.charAt(a.length() - 1 - i);

            }

            if(b.length() - 1 - i >= 0){

                bChar = b.charAt(b.length() - 1 - i);

            }

            

            int sum = ((aChar - '0') + (bChar - '0') + extra) % 2;

            result = String.valueOf(sum) + result;

            extra = ((aChar - '0') + (bChar - '0') + extra) / 2;

        }

        

        if(extra == 1){

            result = String.valueOf(extra) + result;

        }

        return result;

    }

}

update 2015/06/02:

二刷,在a和b较短的前面直接加上0。

public class Solution {

    public String addBinary(String a, String b) {

        String res = "";

        while(a.length() > b.length()) {

            b = "0" + b;

        }

        while(a.length() < b.length()) {

            a = "0" + a;

        }

        int carry = 0;

        for(int i = 0; i < a.length(); i++) {

            int digit = (carry + (int)(a.charAt(a.length() - 1 - i) - '0') + (int)(b.charAt(b.length() - 1 - i) - '0')) % 2;

            carry = (carry + (int)(a.charAt(a.length() - 1 - i) - '0') + (int)(b.charAt(b.length() - 1 - i) - '0')) / 2;

            res = String.valueOf(digit) + res;

        }

        if(carry == 1) {

            res = "1" + res;

        }

        return res;

    }

}

 

你可能感兴趣的:(binary)