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;
}
};