给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1" 输出:"100"
示例 2:
输入:a = "1010", b = "1011" 输出:"10101"
提示:
1 <= a.length, b.length <= 104
a
和b
仅由字符'0'
或'1'
组成- 字符串如果不是
"0"
,就不含前导零
我使用的是最低级的方法,也就是先转化为十进制,然后进行十进制求和,之后再将结果转化为二进制。
代码如下:
class Solution {
public:
string addBinary(string a, string b) {
int lena=a.size();
int anum=0;
int bnum=0;
int lenb=b.size();
for(int i=0;i<lena;i++)
{
if(a[i]=='1')
anum+=pow(2,lena-i-1);
}
for(int i=0;i<lenb;i++)
{
if(b[i]=='1')
bnum+=pow(2,lenb-i-1);
}
int c=anum+bnum;
string str;
while(c>0)
{
if(c%2==1)
str+="1";
else
str+="0";
c=int(c/2);
}
reverse(str.begin(),str.end());
if(str=="")
str="0";
return str;
}
};
但是我的这种方法再处理比较长的二进制数据的时候,会遇到困难,长的二进制数据转化为十进制数处理时间较长。看看标准答案:
class Solution {
public:
string addBinary(string a, string b) {
string ans;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int n = max(a.size(), b.size()), carry = 0;
for (size_t i = 0; i < n; ++i) {
carry += i < a.size() ? (a.at(i) == '1') : 0;
carry += i < b.size() ? (b.at(i) == '1') : 0;
ans.push_back((carry % 2) ? '1' : '0');
carry /= 2;
}
if (carry) {
ans.push_back('1');
}
reverse(ans.begin(), ans.end());
return ans;
}
};
抱歉,看不懂,我使用chat一下。
算了,我们看一下更加简单易懂的解析吧:
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')
{
a[j]=(a[j]-'0')%2+'0';
a[j-1]=a[j-1]+1;
}
}
a[0]=a[0]-'0'+b[0];
if(a[0]>='2')
{
a[0]=(a[0]-'0')%2+'0';
a='1'+a;
}
return a;
}
};
这里就单纯利用了二进制的加法计算,如果加上去之后数值大于1,就向前一位进一,在这里,数值位最大是3,利用2表示为0,3表示为1的特性进行计算。 最后再在最前面一位判断是否进行补加一位。