[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();
    }
}

Read more

[LeetCode] #12 Integer to Roman 解題

題目連結 題型解說 這是一題難度為普通的題目 需要設計一個方法,此方法會傳入一個整數 num 要求是把整數轉換成羅馬字母,轉換清單如下 I => 1 V => 5 X => 10 L => 50 C => 100 D => 500 M => 1000 但羅馬字母有一些特殊規則 4 並非 IIII 而是 IV,9 並非 VIIII 而是 IX 這規則同樣可以套用到 40 90 400 900 解題思路 既然知道特殊規則是一樣的,變得是使用的符號,那麼先從 num 取個位數開始 轉換完成後,把 num 除上 10,消除個位數,

By Michael

[LeetCode] #11 Container With Most Water 解題

題目連結 題型解說 這是一題難度為中等的題目 需要設計一個方法,此方法會傳入一個數字陣列 height 陣列中的元素代表每一個柱子的高度 現在需要計算出,該陣列中以某兩隻柱子為邊界,最多可以裝多少水 以範例來說 height = [1,8,6,2,5,4,8,3,7] 最多可以裝 7 * 7 = 49 單位的水 解題思路 計算面積就是底乘上高 底的計算方式為 「右邊柱子的 index」 減去 「左邊柱子的 index」 高就取最短的那一根柱子高度 拿題目給的例子來當範例 建立三個變數 result、left、right left、right 代表左右兩邊的 index result 代表目前最大容量,初始值 0 第一步,找出最短的柱子高度,

By Michael

[LeetCode] #941 Valid Mountain Array 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個數字陣列 arr 判斷陣列中的元素是不是由低到高再從高到低(山形)的排序,且不連續一個以上數字 比如說 [1,2,3,2] 就是一個山形陣列,但 [1,2,2,3,2] 不是,因為有兩個 2 [1,2,3,4,5] 和 [5,4,3,2,1] 也不算是山形陣列,前者只有往上沒有往下,後者相反 解題思路 準備一個數字變數(temp)和布林變數(asc),跑一次迴圈,有可能遇到如下狀況 1. 某個數字與前一個數字相同,這時候直接回傳 false

By Michael

[LeetCode] #944 Delete Columns to Make Sorted 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個字串陣列 strs 這個陣列中每個字串的長度都相同,字串內容都是小寫英文 需要檢查每個元素的第 N 個字元是不是由小至大排列,並回傳有幾個錯誤排列 比如傳入的陣列長這樣 ["cba","daf","ghi"] 取第一個字元 = cdg 取第二個字元 = bah 取第三個字元 = afi 其中第二組的結果(bah)並不是由小至大排列,故回傳 1 解題思路 這一題就用兩個迴圈各別把字元取出來,並比較是否比上一個字元大(Java 中的字元可以直接比較),如果不是就將結果+1 程式碼 Java class Solution { public int minDeletionSize(String[] strs) { int result = 0; for (int i = 0,

By Michael