// Source : https://leetcode-cn.com/problems/add-binary/
// Date : 2021-11-30
/**************************************************************************************
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
**************************************************************************************/
/*******************************************************************************************************
题目分析: 本题首先要确定的就是两个字符串是否等长,如果二者不等长,则需要在短的字符前面加上0,以避免相加的时候因为位数的原因导致的越界现象,然后要处理的就是相加的时候应该将字符串的每一个字符转为数字进行相加,然后判断是否要进行进位操作,本题的难点就在于进位操作的设计以及字符转数字的操作,还有一个不容易想到的就是在较短的字符串之前要进行补零操作。
********************************************************************************************************/
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;
}
};