LeetCode - 67. Add Binary

題目:

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


思路與步驟:

原思路:

將兩個string逐個字符相加,設置一個flag ,進位的話記 carry=1,反之 carry=0

需要處理的一些細節:

1. a 和 b 的 0, 1 是字符形式,要寫成 '0', '1';flag 是 int 型,寫成 0, 1.

2. 最後一位(即最高位)加完後若 carry 爲1需要給 和 的最高位設爲1,即 和 的位數比a和b中較大位數還多1.

3. 如果a和b的高位有0,加完之後要把和高位上的0去掉。

改進的思路:

看了別人的代碼後發現原來的思路過於繁瑣,現學習別人的簡潔思路:

1. 用 StringBuilder sb = new StringBuilder();

2. StringBuilder可以append 進 int 型的元素;由於二進制的含義是滿 2 進 1,所以還是採用加法運算。

     如果和爲2,則carry 爲1,即 sum/2,sb 中加入的元素爲0,即sum%2;和爲1和0時情況一樣。


編程遇到的問題:

1. 開始用的 char[] 型來儲存和,加的時候從最低位開始,即數組下標最大處開始。結果發現由於最高位是否進1不確定,即數組的大小不確定,沒有辦法初始化數組,所以這個數據結構的選取失敗。

2. 後來想到用 Stack ,但是最後返回是首先是無法轉化成數組,然後發現輸出的順序並不是從棧頂開始(爲什麼,還沒解決)。

3. 既然 stack 無法逆轉,想到用 List ,解決了逆轉的問題,即 Collections.reverse(myList); 最後遇到的問題是無法將List 轉化成 String。此時我已經黔驢技窮,所以看了別人的解法,get了新的知識。


新知識學習:

StringBuilder

常用方法有:append(); length(); charAt(i); deleteCharAt(i); toString()  等。


編程實現:

我的囉嗦但很快的代碼:

public class Solution {
    public String addBinary(String a, String b) {
        char[] achar = a.toCharArray();
        char[] bchar = b.toCharArray();
        int i = a.length()-1, j = b.length()-1, carry = 0;
        StringBuilder sb = new StringBuilder();
        for( ; i>=0 && j>=0; i--,j--){
            if (achar[i] != bchar[j])   sb.append(carry==0 ? '1' : '0');
            else if (achar[i]=='0' && bchar[j]=='0'){
                sb.append(carry==0 ? '0' : '1');
                carry = 0;
            } else if (achar[i]=='1' && bchar[j]=='1'){
                sb.append(carry==0 ? '0' : '1');
                carry = 1;
            }
        }
        while(i > j){
            for( ; i>=0 && carry == 0; i--)    sb.append(achar[i]);
            for( ; i>=0 && carry == 1; i--){
                sb.append(achar[i] == '0' ? '1' : '0');
                carry = (achar[i] == '0' ? 0 : 1);
            }
        }
        while(i < j){
            for( ; j>=0 && carry == 0; j--)    sb.append(bchar[j]);
            for( ; j>=0 && carry == 1; j--){
                sb.append(bchar[j] == '0' ? '1' : '0');
                carry = (bchar[j] == '0' ? 0 : 1);
            }
        }
        if(carry==1) sb.append('1');
        sb.reverse();
        while(sb.length()>1 && sb.charAt(0)=='0')  sb.deleteCharAt(0);
        return sb.toString();
    }
}

學習別人的代碼:

public class Solution {
    public String addBinary(String a, String b) {
        char[] achar = a.toCharArray();
        char[] bchar = b.toCharArray();
        int i = a.length()-1, j = b.length()-1, carry = 0;
        StringBuilder sb = new StringBuilder();
        while (i >= 0 || j >= 0) {
            int sum = carry;
            if (i >= 0) sum += achar[i--]-'0';
            if (j >= 0) sum += bchar[j--]-'0';
            sb.append(sum % 2);
            carry = sum / 2;
        }
        if (carry == 1) sb.append(carry);
        return sb.reverse().toString();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章