Friday, September 27, 2013

Add Binary

Q:
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100".

A:
就是用个StringBuffer , 来保存并计算

public class Solution {
    public String addBinary(String a, String b) {
        // make them backward
        StringBuffer bufA = new StringBuffer(a);
        StringBuffer bufB = new StringBuffer(b);
        StringBuffer bufC = new StringBuffer();
        bufA.reverse();
        bufB.reverse();
        int m = a.length(), n = b.length();
        int carry =0;
        for(int i=0;i<Math.max(m,n);i++){
            int c =0,d=0;
            if(i<m)
                c=bufA.charAt(i)-'0';
            if(i<n)
                d = bufB.charAt(i)-'0';
            bufC.append( (c+d+carry)%2);
            carry = (c+d+carry)/2;
        }
        if(carry ==1)
            bufC.append(1);
        return bufC.reverse().toString();
    }
}

------------------------第二遍---------思路一样---------------
public class Solution {
    public String addBinary(String a, String b) {
        // make two string of the same length
        // assume a is longer
        if(a.length()<b.length()){
            String tmp = b;
            b = a;
            a = tmp;
        }
        // NOW, str2 is shorter
        StringBuffer buf = new StringBuffer(b);
        for(int i =0;i<a.length()-b.length();i++){
            buf.insert(0,'0');
        }
        b = buf.toString();
        // now a and b are of the same length;
        boolean carry = false; // first carry is zero
        StringBuffer result = new StringBuffer();
        for(int i =a.length()-1;i>=0 ; i--){
            boolean aa = a.charAt(i) == '1';
            boolean bb = b.charAt(i) == '1';
            if( logicalXOR(logicalXOR(aa,bb),carry)  ){
                result.insert(0,1);
            }else{
                result.insert(0,0);
            }
            carry = aa&&bb || aa&&carry || bb&&carry;
        }
        if(carry){
            result.insert(0,1);
        }
        return result.toString();
    }
    private static boolean logicalXOR(boolean x, boolean y) {
        return ( ( x || y ) && ! ( x && y ) );
    }
}


Learned:
1: StringBuffer 有个函数,是setCharAt(int index, char ch);
2:  计算residue 可以直接用 a^b即可。  (第一次,是用了!(a^b)了, 哎

 -----------------------3 rd Pass ----------------思路同上,更加简洁-----------------
public class Solution {
    public String addBinary(String a, String b) {
        StringBuffer buf = new StringBuffer();
        int carry = 0;
        int m = a.length();
        int n = b.length();
        for (int i = 0; i < Math.max(m, n); i++) {
            int ai = (i >= m) ? 0 : a.charAt(m-1-i) - '0';
            int bi = (i >= n) ? 0 : b.charAt(n-1-i) - '0';
            int ci = (ai ^ bi) ^ carry;
            buf.insert(0, ci);
            carry = (ai + bi + carry) / 2;
        }
        if (carry == 1)
            buf.insert(0, '1');
        return buf.toString();
    }
}




No comments:

Post a Comment