题目描述:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
解题思路:
首先我们要知道二进制求和,满二进一。
1.开始让两个字符串等长,若不等长,在短的字符串前补零,否则之后的操作会超出索引。
2.然后从后到前遍历所有的位数,同位相加,这里有一个点,用的是字符相加,利用 ASCII 码,字符在内部都用数字表示,我们不需要知道具体数值,但可知 ‘0’-‘0’ = 0, ‘0’+1=‘1’,以此类推 。字符的加减,大小比较,实际上都是内部数字的加减,大小比较。
3.判断相加后的字符,若大于等于字符 ‘2’,下一位需要进一。
4.第 0 位数的相加在这里是单独处理的,因为它可能涉及到字符的插入(即是否需要在最前面加一位数 ‘1’。
代码如下:
public:
string addBinary(string a, string b) {
int t1=a.size(),t2=b.size();
while (t1>t2)//补齐
{
b='0'+b;
t2++;
}
while(t1<t2)//补齐
{
a='0'+a;
t1++;
}
int tmp=0;//进位标识
for(int i=t1-1;i>=0;i--){
int sum =a[i]-'0'+b[i]-'0'+tmp;
a[i]=(sum)%2+'0';//本位数值
tmp=sum/2;//进位更新
}
if(tmp>0)//有溢出
a='1'+a;
return a;
}
};