1. 程式人生 > >LeetCode--67. Add Binary

LeetCode--67. Add Binary

題目連結:https://leetcode.com/problems/add-binary/

這個就是要求將兩個二進位制表示的字串相加返回一個二進位制字串,最需要注意的是進位的問題。

因為是easy的題目,所以思路比較多。

思路一:將兩個二進位制字串轉為對應的十進位制整數,然後相加,將計算結果再轉為二進位制表達的字串。這個思路比較粗暴,這裡不做實現了。

思路二:最終結果字串的長度要麼等於a,b長度的較大者,要麼比較大者多1,所以可以建立一個max(len(a),len(b))+1的陣列,在”0“”1“相加時有四種情況直接列舉,注意進位的標記傳遞。

class Solution {
    public String addBinary(String a, String b) {
        int i=a.length()-1,j=b.length()-1;
        if(i<0)
            return b;
        if(j<0)
            return a;
        char[] ret=new char[Math.max(i,j)+2];
        int k=ret.length-1;
        boolean addition=false;
        while(i>=0 && j>=0)
        {
            if(a.charAt(i)=='1' && b.charAt(j)=='1')
            {
                if(addition)
                    ret[k]='1';
                else
                    ret[k]='0';
                addition=true;
            }
            else if((a.charAt(i)=='0' && b.charAt(j)=='1')||(a.charAt(i)=='1' && b.charAt(j)=='0'))
            {
                if(addition)
                {
                     ret[k]='0';
                    addition=true;
                }
                else
                    ret[k]='1';
            }
            else
            {
                if(addition)
                    ret[k]='1';
                else
                    ret[k]='0';
                addition=false;
            }
            i--;j--;k--;
        }
        
        if(i>=0)
        {
            while(i>=0)
            {
                if(a.charAt(i)=='0')
                {
                    if(addition)
                        ret[k]='1';
                    else
                        ret[k]='0';
                    addition=false;
                }
                else
                {
                    if(addition)
                    {
                        ret[k]='0';
                        addition=true;
                    }
                    else
                        ret[k]='1';
                }
                i--;k--;
            }
        }
        
        if(j>=0)
        {
            while(j>=0)
            {
                if(b.charAt(j)=='0')
                {
                    if(addition)
                        ret[k]='1';
                    else
                        ret[k]='0';
                    addition=false;
                }
                else
                {
                    if(addition)
                    {
                        ret[k]='0';
                        addition=true;
                    }
                    else
                        ret[k]='1';
                }
                j--;k--;
            }
        }
        if(addition)
             ret[0]='1';
        else
            ret[0]='0';
        String s=new String(ret);
        if(ret[0]=='1')
            return s.substring(0,s.length());
        else
            return s.substring(1,s.length());
    }
}

雖然寫了100行但是執行效率還是滿分的,時間複雜度為O(n),空間複雜度O(n).