1. 程式人生 > >leetCode 67. 二進位制求和 java實現

leetCode 67. 二進位制求和 java實現

leetCode 67. 二進位制求和 java實現

題目:

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

輸入為非空字串且只包含數字 1 和 0。

示例 1:

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

示例 2:

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

思路:

  • 將字串先等長位數的計算求和,同時維護一個進位數(取值範圍為0,1)。
  • 每一位的真正的sum = 進位數+a字元串同位置的值+b字元串同位置的值
  • 進位數 = sum/2(二進位制)
  • 結果值 = 進位值 與 之前的結果值拼接

    /**
     * 二進位制求和
     * @param a a number
     * @param b a number
     * @return the result
     */
    public static String addBinary(String a, String b) {
       //結果值
        String res = "";
        //進位值
        int advance = 0;
        //同位數的真正的和
        int sum = 0;
        //若字串a的長度小於字串b的長度,兩個字串交換,使a字串始終是長字串
if (a.length() < b.length()){ String temp = a; a = b; b = temp; } //從末位開始相加 int lastA = a.length() - 1; int lastB = b.length() - 1; while (lastB >= 0){ //char'0'的十進位制數值為48,(a.charAt(lastA) -'0') 算出a字串在lastA位置的十進位制數值
sum = (a.charAt(lastA) -'0') + (b.charAt(lastB) - '0') +advance; res = sum%2 + res; advance = sum/2; lastA --; lastB --; } while (lastA >= 0){ sum = a.charAt(lastA) - '0' + advance; res = sum%2 + res; advance = sum/2; lastA -- ; } if (advance == 1){ res = advance + res; } return res; }

結果:

7ms;戰勝37.82%用時,待改進