LintCode | 408. 二進制求和

給定兩個二進制字符串,返回他們的和(用二進制表示)。

比較蠢的辦法

public class Solution {

    public String addBinary(String a, String b) {
        //分別用 max min 指向長度最長 最短字符串
        String max, min;
        if(a.length() > b.length()) {
            max = a;
            min = b;
        } else {
            max = b;
            min = a;
        }

        //逐位計算,用 StringBuilder 來保存
        StringBuilder sum = new StringBuilder("");
        //進位標誌
        int carry = 0;

        //先進行短字符串長度部分的位運算
        for(int i = 1; i < min.length() + 1; i++) {
            //每次循環取出兩個字符串的同一位
            char ai = a.charAt(a.length() - i);
            char bi = b.charAt(b.length() - i);
            //分別判斷各位情況,注意進位
            if(ai == '0' && bi == '0') {
                sum.insert(0, carry);
                carry = 0;
            } else if(ai != bi) {
                if(carry == 0) sum.insert(0, 1);
                else sum.insert(0, 0);
            } else if(ai == '1' && bi == '1') {
                if(carry == 0) sum.insert(0, 0);
                else sum.insert(0, 1);
                carry = 1;
            }
        }

        //短字符串長度部分比較完後,再單獨計算長字符串多出來的部分
        for(int i = max.length() - min.length() - 1; i >= 0; i--) {
            if(carry == 1) {
                if(max.charAt(i) == '1') {
                    sum.insert(0, 0);
                    carry = 1;
                } else {
                    sum.insert(0, 1);
                    carry = 0;
                }
            } else {
                sum.insert(0, max.substring(0, i+1));
                break;
            }
        }

        //最後,對於最高位有進位的情況補1
        if(carry == 1) sum.insert(0, 1);

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