美文网首页
67 add binary

67 add binary

作者: yangminz | 来源:发表于2018-07-15 23:56 被阅读16次

title: Add Binary
tags:
- add-binary
- No.67
- simple
- boolean-algebra


Problem

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

The input strings are both non-empty and contains only characters 1 or 0.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"

Corner Cases

  • carry digit

Solutions

Boolean Algebra

By adding binary in String, we can avoid the annoying complement and int range problem. We only need to consider the two digits x, y, and carry c from last digit. The truth table is:

x y c s c_
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1

The sum of minterms can be drawn from truth table:

s  = (!x && !y && c) || (!x &&  y && !c) || ( x && !y && !c) || ( x &&  y &&  c);
c_ = (!x &&  y && c) || ( x && !y &&  c) || ( x &&  y && !c) || ( x &&  y &&  c);

Then we convert boolean values into strings. Be careful with different lengths and highest digit.

The running time is O(n).

class Solution {
    public String addBinary(String a, String b) {
        boolean c = false;
        String  t = "";
        
        String longOne  = (a.length() > b.length()) ? a : b;
        String shortOne = (a.length() > b.length()) ? b : a;
        int    ll       = longOne.length();
        int    sl       = shortOne.length();
        
        for (int i=sl-1; 0<=i; i--) {
            t = digit(shortOne.charAt(i), longOne.charAt(i+ll-sl), c).concat(t);
            c = carry(shortOne.charAt(i), longOne.charAt(i+ll-sl), c);
        }
        for (int i=ll-sl-1; 0<=i; i--) {
            t = digit('0', longOne.charAt(i), c).concat(t);
            c = carry('0', longOne.charAt(i), c);
        }
        if (c) {t = "1".concat(t);}
        
        return t;
    }
    
    private String digit(char aa, char bb, boolean c) {
        boolean x = (aa == '1');
        boolean y = (bb == '1');
        return (!x && !y && c) || (!x && y && !c) || (x && !y && !c) || (x && y && c) ? "1" : "0";
    }
    
    private boolean carry(char aa, char bb, boolean c) {
        boolean x = (aa == '1');
        boolean y = (bb == '1');
        return (!x && y && c) || (x && !y && c) || (x && y && !c) || (x && y && c);
    }
}

相关文章

网友评论

      本文标题:67 add binary

      本文链接:https://www.haomeiwen.com/subject/zbmmpftx.html