Monday, September 7, 2015

[Add][Math] Add Binary

1. Example

a= "11"
b ="  1"
Return "100"


2. Implementation
Q1:MSB->LSB
A1: From the end(len-1) and add backward . Consider carry
Q1: carry =1?
A1: add one more character
Q1: Add one more character ?
A1: StringBuilder.append("1").reverse()


res.append(sum%2);


// NOTE: iterating aIndex--; bIndex--;


// NOTE: remain digits while( aIndex >= 0 ) { int sum = (int) (a.charAt(aIndex) - '0') + carry; carry = sum /2; res.append(sum); aIndex--; } while ( bIndex >= 0) { int sum = (int) ( b.charAt( bIndex)- '0') + carry; carry = sum /2; res.append(sum); bIndex--; }


if ( carry > 0) res.append(carry);


// NOTE: reverse() is for StringBuilder 

 return res.reverse().toString();

// time:O(max(m,n)), Space:O(n) stringbuilder
public String addBinary(String a, String b)
{
     


       // validate the input
       if (a == null || a.length() ==0 )
         return b;
       if (b == null || b.length () == 0)
         return a;

  


       StringBuilder res = new StringBuilder();
       int aIndex = a.length()-1;
       int bIndex = b.length()-1;
       int carry = 0;
       while (aIndex >=0 && bIndex >=0 )
       {
            int sum = (int) (a.charAt(aIndex)-'0') + (int) (b.charAt(bIndex) - '0') + carry;
            // NOTE: append data type int ,double, boolean..etc,http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html
            //res.append( String.valuesOf(sum%2) );
            res.append(sum%2);
            carry = sum/2;
            // NOTE: iterating
            aIndex--;
            bIndex--;
       }






       // NOTE: remain digits
       while( aIndex >= 0 )
       {
            int sum = (int) (a.charAt(aIndex) - '0') + carry;
            carry = sum /2;
            res.append(sum); 
            aIndex--;
       }
       while ( bIndex >= 0)
       {
            int sum = (int) ( b.charAt( bIndex)- '0') + carry;
            carry = sum /2;
            res.append(sum);
            bIndex--;
       }





       //if (carry ==1 )
       //     res.append("1");
       if ( carry > 0)
              res.append(carry);




       
       //res.toString().reverse();
       // NOTE: reverse() is for StringBuilder
       return res.reverse().toString();




}
3. Similar ones
(M) Add Two Numbers
(M) Multiply Strings
(M) Plus One

No comments:

Post a Comment