1. 程式人生 > >leetcode add_binary 採坑記

leetcode add_binary 採坑記

儘管add_binary在leetcode中是一個簡單難度,但是踩了不少坑,記錄一下

描述:

給兩個字串形式的二進位制數,要求求和並輸出字串形式的結果,其中a和b均不為空字串

樣例:

a=“1010”,b="1011",輸出“10101”.

 

過程:

剛看到題目的時候覺得很簡單,只要每一位按位相加就好了,很容易寫出第一版程式碼

public class AddBinary {
    public String add_binary(String a,String b){
        char[] chars_a = a.toCharArray();
        char[] chars_b = b.toCharArray();
        
        int c_out = 0;

        // 統計最長位數,將chars_a設定為最長的
        int max_length = chars_a.length;
        if(chars_a.length<chars_b.length){
            max_length = chars_b.length;
            char[] temp = chars_a;
            chars_a = chars_b;
            chars_b = temp;
        }
        
        // 設定結果長度為長的那個
        char[] result = new char[max_length];
        // 計算結果
        for(int i=0;i<max_length;i++){
            int t;
            if(i<chars_b.length){
                // 重合部分
                t = chars_a[i]-'0'+chars_b[i]-'0'+c_out;
            }else {
                // 非重合部分
                t = chars_a[i]+c_out;
            }
            if(t>1){
                c_out = 1;
                result[i]=(char)(t-2);
            }else {
                c_out=0;
                result[i]=(char)t;
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        if(c_out!=0){
            stringBuilder.append(1);
        }
        stringBuilder.append(result);
        return stringBuilder.toString();
    }
}

  開心的測試了一下,結果輸出的是什麼東西,還有空白符,這就是不嚴謹的問題了,在設定result[i]的時候沒有考慮到再加上‘0’的ASCII碼值,導致輸出的是0或者1對應的ASCII值結果,實驗第二版程式碼

public class AddBinary {
    public String add_binary(String a,String b){
        char[] chars_a = a.toCharArray();
        char[] chars_b = b.toCharArray();

        int c_out = 0;

        // 統計最長位數,將chars_a設定為最長的
        int max_length = chars_a.length;
        if(chars_a.length<chars_b.length){
            max_length = chars_b.length;
            char[] temp = chars_a;
            chars_a = chars_b;
            chars_b = temp;
        }

        // 設定結果長度為長的那個
        char[] result = new char[max_length];
        // 計算結果
        for(int i=0;i<max_length;i++){
            int t;
            if(i<chars_b.length){
                // 重合部分
                t = chars_a[i]-'0'+chars_b[i]-'0'+c_out;
            }else {
                // 非重合部分
                t = chars_a[i]-'0'+c_out;
            }
            if(t>1){
                c_out = 1;
                result[i]=(char)(t-2+'0');
            }else {
                c_out=0;
                result[i]=(char)(t+'0');
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        if(c_out!=0){
            stringBuilder.append(1);
        }
        stringBuilder.append(result);
        return stringBuilder.toString();
    }
}

  結果顯示都是數字了沒問題,但是計算的結果為什麼出錯了,原因在於String.toCharArray(),是按照從左向右的順序讀入的,即第零位是二進位制數的最高為,相當於反了過來,所以第三版程式碼出現了

public class AddBinary {
    public String add_binary(String a,String b){
        char[] chars_a = a.toCharArray();
        char[] chars_b = b.toCharArray();

        int c_out = 0;

        // 統計最長位數,將chars_a設定為最長的
        int max_length = chars_a.length;
        if(chars_a.length<chars_b.length){
            max_length = chars_b.length;
            char[] temp = chars_a;
            chars_a = chars_b;
            chars_b = temp;
        }

        // 設定結果長度為長的那個
        char[] result = new char[max_length];
        // 計算結果
        for(int i=0;i<max_length;i++){
            int t;
            if(i<chars_b.length){
                // 重合部分
                t = chars_a[max_length-i-1]-'0'+chars_b[chars_b.length-i-1]-'0'+c_out;
                System.out.println(chars_a[max_length-i-1]+","+chars_b[chars_b.length-i-1]+","+c_out+","+t);
            }else {
                // 非重合部分
                t = chars_a[max_length-i-1]-'0'+c_out;
                System.out.println(chars_a[max_length-i-1]+","+c_out+","+t);
            }
            if(t>1){
                c_out = 1;
                result[max_length-i-1]=(char)(t-2+'0');
            }else {
                c_out=0;
                result[max_length-i-1]=(char)(t+'0');
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        if(c_out!=0){
            stringBuilder.append(1);
        }
        stringBuilder.append(result);
        return stringBuilder.toString();
    }
}

  總算是ac了,感覺很是坑啊