67. Add Binary

题目:

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

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

链接:  http://leetcode.com/problems/add-binary/

题解:

Add two binary strings,从后向前加即可,最后判断一下carry = 1的case。 这种code,算法其实不重要,还要多思考多练写得比较concise才好。要手熟。

Time Complexity - O(n), Space Complextiy O(1)

public class Solution {
    public String addBinary(String a, String b) {
        if(a == null || b == null)
            return "0";
        int aIndex = a.length() - 1, bIndex = b.length() - 1;
        int carry = 0, curDigit = 0;
        StringBuilder sb = new StringBuilder();
        
        while(aIndex >= 0 || bIndex >= 0) {
            int aValue = aIndex >= 0 ? a.charAt(aIndex) - '0' : 0;
            int bValue = bIndex >= 0 ? b.charAt(bIndex) - '0' : 0;
            curDigit = (aValue + bValue + carry) % 2;
            sb.insert(0, curDigit);
            carry = (aValue + bValue + carry) >= 2 ? 1 : 0;
            aIndex--;
            bIndex--;
        }
        
        if(carry == 1)
            sb.insert(0, "1");
        
        return sb.toString();
    }
}

二刷:

Java:

使用或,使用sb.insert(0, curDigit)。 

Time Complexity - O(n2), Space Complexity - O(n)

public class Solution {
    public String addBinary(String a, String b) {
        if (a == null || b == null) {
            return "0";
        }
        int aHi = a.length() - 1, bHi = b.length() - 1;
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        while (aHi >= 0 || bHi >= 0) {
            int digitA = aHi >= 0 ? a.charAt(aHi) - '0' : 0;
            int digitB = bHi >= 0 ? b.charAt(bHi) - '0' : 0;
            sb.insert(0, (digitA + digitB + carry) % 2);
            carry = (digitA + digitB + carry) >= 2 ? 1 : 0;
            aHi--;
            bHi--;
        }
        if (carry == 1) {
            sb.insert(0, 1);
        }
        return sb.toString();
    }
}

这样写快一点点:

先append, 再reverse来一遍

public class Solution {
    public String addBinary(String a, String b) {
        if (a == null || b == null) {
            return "0";
        }
        int aHi = a.length() - 1, bHi = b.length() - 1;
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        while (aHi >= 0 || bHi >= 0) {
            int digitA = aHi >= 0 ? a.charAt(aHi) - '0' : 0;
            int digitB = bHi >= 0 ? b.charAt(bHi) - '0' : 0;
            sb.append((digitA + digitB + carry) % 2);
            carry = (digitA + digitB + carry) >= 2 ? 1 : 0;
            aHi--;
            bHi--;
        }
        if (carry == 1) {
            sb.append(1);
        }
        String res = sb.toString();
        sb.setLength(0);
        for (int i = res.length() - 1; i >= 0; i--) {
            sb.append(res.charAt(i));
        }
        return sb.toString();
    }
}

三刷:

Java:

public class Solution {
    public String addBinary(String a, String b) {
        if (a == null || b == null) return "0";
        int i = a.length() - 1, j = b.length() - 1;
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        while (i >= 0 || j >= 0) {
            int digitA = i >= 0 ? a.charAt(i) - '0' : 0;
            int digitB = j >= 0 ? b.charAt(j) - '0' : 0;
            sb.append((digitA + digitB + carry) % 2);
            carry = (digitA + digitB + carry) >= 2 ? 1 : 0;
            i--;
            j--;
        }
        if (carry == 1) sb.append(1);
        String res = sb.toString();
        sb.setLength(0);
        for (int k = res.length() - 1; k >= 0; k--) sb.append(res.charAt(k));
        return sb.toString();
    }
}

Update:

使用一个char[] array来保存数组,最后遍历char[] array,把每一个数字放在StringBuilder里,最后返回结果。

public class Solution {
    public String addBinary(String a, String b) {
        if (a == null || b == null) return "";
        int i = a.length() - 1, j = b.length() - 1;
        int[] digits = new int[i + j + 2];
        int k = digits.length - 1;
        int carry = 0;
        while (i >= 0 || j >= 0) {
            int digitA = (i >= 0) ? (a.charAt(i) - '0') : 0;
            int digitB = (j >= 0) ? (b.charAt(j) - '0') : 0;
            digits[k--] = (digitA + digitB + carry) % 2;
            carry =  (digitA + digitB + carry >= 2) ? 1 : 0;
            i--;
            j--;
        }
        if (carry == 1) digits[k] = 1;
        StringBuilder sb = new StringBuilder();
        for (int digit : digits) {
            if (digit == 0 && sb.length() == 0) continue;
            sb.append(digit);
        }
        if (sb.length() == 0) return "0";
        return sb.toString();
    }
}

原文地址:https://www.cnblogs.com/yrbbest/p/4436429.html