给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1
和 0
。
新增知识:
reverse函数:用于翻转字符串的顺序
at 函数:用于对字符串中的字符取值
push_back函数:向容器尾部添加元素
size_t 无符号整数: 在数组下标,字符数和内存管理函数之类的地方广泛使用,用于表示正整数,出现负数会报错
解题思路:
题目要求返回二进制表示的数字,所以要观察两个二进制数相加的规律,是逢二进一,分为进位和本位和,由于字符串索引是从低位到高位,即从左向右,而二进制数的低位在右边,所以首先要对二进制数进行翻转,然后从低位开始遍历求和,注意两个二进制数可能不是同位数的,要取数字最大的长度,从低位对其开始相加,如果最高位的进位不为0,要进行添加到末尾,最后将得到的二进制数字进行翻转。
本位和: 两个数和上一位的进位数相加对2取模
和为1:为1
和为2:为0
和为3:为1
总结规律
进位数:两个数和上一位的进位数相加整除2
和为1:为1
和为2: 为1
和为3:为1
总结规律
代码:
class Solution {
public:
string addBinary(string a, string b) {
string ans;//设置新的二进制字符串
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());//翻转两个二进制数于位数对应
int l=max(a.size(),b.size());//取最大长度
int k=0;//设定进位数字并初始化为0
for(size_t i=0;i
{
k+=i
if(i
{
k+=i
}
if(k%2==1)
{
ans.push_back('1');
}
else
{
ans.push_back('0');//添加进位和
}
k/=2;//进位发生变化
}
if(k!=0)
{
ans.push_back('1');
}
reverse(ans.begin(),ans.end());//最后翻转
return ans;
}
};