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/

一刷,最简单的分两段计算。

class Solution(object):
    def addBinary(self, a, b):
        if not a:
            return b
        if not b:
            return a
        
        result = []
        common_length = min(len(a), len(b))
        carry = 0
        
        for idx in range(1, common_length + 1):
            carry, ret = (int(a[-idx]) + int(b[-idx]) + carry) / 2, (int(a[-idx]) + int(b[-idx]) + carry) % 2
            result.append(str(ret))
        
        rest = a if len(a) > common_length else b
        for idx in range(common_length + 1, len(rest) + 1):
            carry, ret = (int(rest[-idx]) + carry) / 2, (int(rest[-idx]) + carry) % 2
            result.append(str(ret))
        
        if carry:
            result.append(str(carry))
        result.reverse()
        return ''.join(result)

一次遍历,可以减少边界条件的分析

class Solution(object):
    def addBinary(self, a, b):

        if not a:
            return b
        if not b:
            return a
        
        result = []
        a_index = len(a) - 1
        b_index = len(b) - 1
        carry = 0
        
        while a_index >= 0 or b_index >= 0:
            a_val = int(a[a_index]) if a_index >= 0 else 0
            b_val = int(b[b_index]) if b_index >= 0 else 0
            carry, ret = (a_val + b_val + carry) / 2, (a_val + b_val + carry) % 2
            result.append(str(ret))
            a_index -= 1
            b_index -= 1

        if carry:
            result.append(str(carry))
        result.reverse()
        return ''.join(result)

2/12/2017, Java, 无脑乱刷。非常需要改进

错误

1. StringBuilder的各种方法:setLength(), setCharAt(), append()

2. 判断第一次相加是否为0,初始条件判断缺失,不但在2个相加时,最后只剩下一个String的时候第一次也需要判断

3. char没有int(char)这种方法,只能通过char - '0'来判断

 1 public class Solution {
 2     public String addBinary(String a, String b) {
 3         StringBuilder ret = new StringBuilder();
 4         ret.setLength(Math.max(a.length(), b.length()));
 5         int sum;
 6         int carry = 0;
 7         int i = a.length() - 1, j = b.length() - 1;
 8         
 9         for(;i >= 0 && j >= 0;i--, j--) {
10             sum = a.charAt(i) - '0' + b.charAt(j) - '0' + carry;
11             if (sum == 0) {
12                 ret.setCharAt(Math.max(i, j), '0');
13                 carry = 0;
14             } else if (sum == 1) {
15                 ret.setCharAt(Math.max(i, j), '1');
16                 carry = 0;
17             } else if (sum == 2) {
18                 ret.setCharAt(Math.max(i, j), '0');
19                 carry = 1;
20             } else {
21                 ret.setCharAt(Math.max(i, j), '1');
22                 carry = 1;
23             }
24         }
25         for(; i >= 0; i--) {
26             sum = a.charAt(i) - '0' + carry;
27             if (sum == 0) {
28                 ret.setCharAt(i, '0');
29                 carry = 0;
30             } else if (sum == 1) {
31                 ret.setCharAt(i, '1');
32                 carry = 0;
33             } else {
34                 ret.setCharAt(i, '0');
35                 carry = 1;                
36             }
37         }
38         for(; j >= 0; j--) {
39             sum = b.charAt(j) - '0' + carry;
40             if (sum == 0) {
41                 ret.setCharAt(j, '0');
42                 carry = 0;
43             } else if (sum == 1) {
44                 ret.setCharAt(j, '1');
45                 carry = 0;
46             } else {
47                 ret.setCharAt(j, '0');
48                 carry = 1;                
49             }
50         } 
51         if (carry != 0) {
52             StringBuilder ret1 = new StringBuilder("1");
53             ret1.append(ret);
54             return ret1.toString();
55         }
56         return ret.toString();
57     }
58 }
原文地址:https://www.cnblogs.com/panini/p/5582783.html