Leetcode刷題指南-67二進制求和

1)題目

二進制求和

要求:

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

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

樣例:

示例 1:

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

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

2)思路

二進制求和,滿二進一

首先讓兩個字符串等長,若不等長,在短的字符串前補零,否則之後的操作會超出索引。
然後從後到前遍歷所有的位數,同位相加,這裏有一個點,用的是字符相加,利用 ASCII 碼,字符在內部都用數字表示,我們不需要知道具體數值,但可知 ‘0’-‘0’ = 0, ‘0’+1=‘1’,以此類推 。字符的加減,大小比較,實際上都是內部數字的加減,大小比較
判斷相加後的字符,若大於等於字符 ‘2’‘2’,下一位需要進一
第 00 位數的相加在這裏是單獨處理的,因爲它可能涉及到字符的插入(即是否需要在最前面加一位數 ‘1’‘1’

3)代碼

class Solution {
public:
    string addBinary(string a, string b) {
        int al = a.size();
        int bl = b.size();
        while(al < bl) //讓兩個字符串等長,若不等長,在短的字符串前補零,否則之後的操作會超出索引
        {
            a = '0' + a;
            ++ al;
        }
        while(al > bl)
        {
            b = '0' + b;
            ++ bl;
        }
        for(int j = a.size() - 1; j > 0; -- j) //從後到前遍歷所有的位數,同位相加
        {
            a[j] = a[j] - '0' + b[j];
            if(a[j] >=  '2') //若大於等於字符‘2’,需要進一
            {
                a[j] = (a[j] - '0') % 2 + '0';
                a[j-1] = a[j-1] + 1;
            }
        }
        a[0] = a[0] - '0' + b[0]; //將ab的第0位相加
        if(a[0] >= '2') //若大於等於2,需要進一
        {
            a[0] = (a[0] - '0') % 2 + '0';
            a = '1' + a;
        }
        return a;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章