[leetcode日記]67.二進制求和

題目

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

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

示例 1:

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

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

提示:

每個字符串僅由字符 ‘0’ 或 ‘1’ 組成。 1 <= a.length, b.length <= 10^4 字符串如果不是 “0”
,就都不含前導零。

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/add-binary
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

分析

這道題目其實還好,如果是C 語言的話從最低位到最高位一個for循環應該就搞定了。不過由於題目不算難,所以我想試一試Java。
Java封裝了字符串,不能像C一樣自如地操作字符串內容。不過可以用append來依次增加字符串的長度,但是面臨一個問題,append只能把新增的字符放在末尾,對應的應該是最低爲。而正常計算則是應該先產生低位,再結合是否進位確定高位。
所以這裏先倒序地將結果保存在Java字符串中,然後再用reverse方法將字符串轉置即可。

代碼

class Solution {
    public String addBinary(String a, String b) {
        StringBuffer ans = new StringBuffer();
        // 將從低到高的運算結果用append方法放在字符串末尾
        // 然後再用reverse方法將字符串轉置
        int n = Math.max(a.length(), b.length()), carry = 0;
        for (int i = 0; i < n; ++i) {
            carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
            carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
            ans.append((char) (carry % 2 + '0'));
            carry /= 2;     // carry用於保存進位
        }

        if (carry > 0) { // 如果最後carry不爲0說明有進位,最高位進位結果只能爲1
            ans.append('1');
        }
        ans.reverse();

        return ans.toString();
    }
}

運行結果

在這裏插入圖片描述
Java實現起來確實要慢一些,結果總是沒有C那麼好看。

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