[LeetCode] #67 Add Binary 解題

題目連結

題型解說

這是一題難度為簡單的題目

需要設計一個方法,此方法會傳入兩個字串 a 和 b,字串內容是二進制(只有 0 和 1)

將兩個字串的二進制內容相加後回傳

範例:

a = "11", b = "1",則回傳 "100",因為 11 + 1 = 100
a = "1010", b = "1011",則回傳 "10101"

解題思路

跟之前的一些題目一樣,有字串解跟數字解兩種方式

字串解比較直覺,但效能較差一些,程式碼也會多一些

兩種解同樣都是從字串最後面往回歷遍,等同於加法方式,由右到左

程式碼

Java

class Solution {
    public String addBinary(String a, String b) {
        int index1 = a.length() -1;
        int index2 = b.length() -1;
        StringBuilder sb = new StringBuilder();
        
        boolean flag = false;
        while (index1 > -1 || index2 > -1) {
            if (flag) { // 有進位
                if (index1 > -1 && index2 > -1) {
                    char c1 = a.charAt(index1--);
                    char c2 = b.charAt(index2--);

                    if (c1 == '0' && c2 == '0') {
                        sb.insert(0, '1');
                        flag = false;
                    } else if (c1 == '1' && c2 == '1') {
                        sb.insert(0, '1');
                    } else {
                        sb.insert(0, '0');
                    }
                } else if (index1 > -1) {
                    switch (a.charAt(index1--)) {
                        case '0':
                            sb.insert(0, '1');
                            flag = false;
                            break;
                            
                        case '1':
                            sb.insert(0, '0');
                            break;
                    }
                } else {
                    switch (b.charAt(index2--)) {
                        case '0':
                            sb.insert(0, '1');
                            flag = false;
                            break;
                            
                        case '1':
                            sb.insert(0, '0');
                            break;
                    }
                }
                
                continue;
            }
            
            if (index1 > -1 && index2 > -1) {
                char c1 = a.charAt(index1--);
                char c2 = b.charAt(index2--);
                
                if (c1 == '0' && c2 == '0') {
                    sb.insert(0, '0');
                } else if (c1 == '1' && c2 == '1') {
                    sb.insert(0, '0');
                    flag = true;
                } else {
                    sb.insert(0, '1');
                }
            } else if (index1 > -1) {
                sb.insert(0, a.charAt(index1--));
            } else {
                sb.insert(0, b.charAt(index2--));
            }
        }
        
        if (flag) {
            sb.insert(0, '1');
        }
        
        return sb.toString();
    }
}
class Solution {
    public String addBinary(String a, String b) {
        int index1 = a.length() -1;
        int index2 = b.length() -1;
        StringBuilder sb = new StringBuilder();
        
        int sum = 0;
        while (index1 > -1 || index2 > -1) {
            if (index1 > -1) {
                sum += a.charAt(index1--) - '0';
            }
            
            if (index2 > -1) {
                sum += b.charAt(index2--) - '0';
            }
            
            sb.insert(0, sum %2);
            sum /= 2;
        }
        
        if (sum > 0) {
            sb.insert(0, '1');
        }
        
        return sb.toString();
    }
}