leetcode-question67 二進制求和

題目描述

給定兩個二進制字符串,返回他們的和(用二進制表示)
輸入爲非空字符串且只包含數字 1 和 0。
示例 1:

輸入: a = “11”, b = “1”
輸出: “100”

示例 2:

輸入: a = “1010”, b = “1011”
輸出: “10101”

思路

將字符串轉化爲int數組,數組的長度爲兩個字符串最長長度+1(長度+1的原因是考慮到最高位進位的情況),然後將a,b字符串對應的數組按右對齊進行賦值,如“111”和“1”賦值爲[0,1,1,1]和[0,0,1,1],然後從後向前逐位進行相加,滿2進位。最後,將得到的結果轉化爲字符串。注意去掉結果前面的0,如果結果全爲0,則返回字符串 “0”。注意: a b 字符串中全爲0情況,這種情況下 結果爲全爲0,返回的數組爲0。

代碼

class Solution {
    /**
     * 將字符串轉化爲int數組,數組的長度爲兩個字符串最長長度+1(長度+1的原因是考慮到最高位進位的情況),然後將a,b字符串對應的數組
     * 按右對齊進行賦值,如“111”和“1”賦值爲[0,1,1,1]和[0,0,1,1],然後從後向前逐位進行相加,滿2進位。
     * 最後,將得到的結果轉化爲字符串。注意去掉結果前面的0,如果結果全爲0,則返回字符串 "0"。
     * 注意: a b 字符串中全爲0情況,這種情況下 結果爲全爲0,返回的數組爲0。
     */
    public String addBinary(String a, String b) {
        char[] a2char = a.toCharArray();
        char[] b2char = b.toCharArray();
        StringBuilder sb = new StringBuilder();
         //得到int數組最大的長度,用於後續的循環,多加一位用於進位的情況
        int maxLength = a.length() < b.length() ? b.length() : a.length() + 1;
        
        int maxArrayLength = maxLength + 1;
        
        int[] a2int = new int[maxArrayLength];
        int[] b2int = new int[maxArrayLength];
        //將字符串a轉化爲int數組
        for(int i = a.length() - 1; i >= 0; -- i){
            if(a2char[i] == '1'){
                a2int[-- maxArrayLength] = 1;
            }else if(a2char[i] == '0'){
                a2int[-- maxArrayLength] = 0;
            }
        }
        maxArrayLength = maxLength + 1;
         //將字符串b轉化爲int數組
        for(int i = b.length() - 1; i >= 0; -- i){
            if(b2char[i] == '1'){
                b2int[-- maxArrayLength] = 1;
            }else if(b2char[i] == '0'){
                b2int[-- maxArrayLength] = 0;
            }
        }
        maxArrayLength = maxLength + 1;
        //兩數組相加
        for(int i = maxArrayLength - 1; i >= 0; -- i){
            if((a2int[i] + b2int[i]) > 1){
                int carry = (a2int[i] + b2int[i]) / 2;
                int remainder = (a2int[i] + b2int[i]) % 2;
                a2int[i] = remainder;
                if(carry > 0){
                    a2int[i - 1] += carry;
                }
            }else{
                a2int[i] += b2int[i]; 
            }
        }
        //去掉計算結果中左邊的0
        int start = a2int.length;
        for(int i = 0; i < a2int.length; ++ i){
            if(a2int[i] == 0){
                continue;
            }else{
                start = i;
                break;
            }
        }
        //將計算結果轉換爲字符串
        if(start == a2int.length){
            sb.append(0);
        }else{
        	for(int i = start; i < a2int.length; ++ i){
                sb.append(a2int[i]);  
            }
        }
        return sb.toString();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章