给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
照例先给出菜鸡想法,依次从末尾读入一个字符,然后转换为1、0求解,中间还多余考虑了某个字符长度较长的情况,但毫无疑问思路不够清晰
class Solution
{
public:
string addBinary(string a, string b)
{
int count_a = a.size(), count_b = b.size();
string result;
map<char, int> map1 = {{'1', 1}, {'0', 0}};
map<int, char> map2 = {{1, '1'}, {0, '0'}};
result.resize(count_a > count_b ? count_a : count_b);
int num = result.size() - 1;
count_b--;
count_a--;
int add = 0;
while (count_a >= 0 && count_b >= 0)
{
result[num] = map2[(map1[a[count_a]] + map1[b[count_b]] + add) % 2];
add = (map1[a[count_a]] + map1[b[count_b]] + add) / 2;
count_b--;
count_a--;
num--;
}
while (count_b >= 0)
{
result[num] = map2[(map1[b[num]] + add) % 2];
add = (map1[b[num]] + add) / 2;
num--;
}
while (count_a >= 0)
{
result[num] = map2[(map1[a[num]] + add) % 2];
add = (map1[a[num]] + add) / 2;
num--;
}
if (add == 1)
result.insert(result.begin(), '1');
return result;
}
};
做之前其实我也想了,把字符长度补相同。相当于把后面的移到前面
class Solution
{
public:
string addBinary(string a, string b)
{
int count_a = a.size(), count_b = b.size();
while (count_a > count_b)
{
b = '0' + b;
count_b++;
}
while (count_a < count_b)
{
a = '0' + a;
count_a++;
}
string result;
map<char, int> map1 = {{'1', 1}, {'0', 0}};
map<int, char> map2 = {{1, '1'}, {0, '0'}};
result.resize(count_a);
count_a--;
int add = 0;
while (count_a >= 0)
{
result[count_a] = map2[(map1[a[count_a]] + map1[b[count_a]] + add) % 2];
add = (map1[a[count_a]] + map1[b[count_a]] + add) / 2;
count_a--;
}
if (add == 1)
result = '1' + result;
return result;
}
};
但是还有问题,我解决字符相加的是用map去做的,之前想用判断去做,但是怕代码啰嗦,这个问题可以用条件运算符来做,我看到还有用字符向加减来做的,以及可以先把string反转过来,这样也不用设置它的大小了。
这个我觉得主要记住了STL通用reverse还有字符相加
#include <string>
class Solution
{
public:
string addBinary(string a, string b)
{
string result;
int num = a.size() > b.size() ? a.size() : b.size();
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int add = 0;
for (int i = 0; i < num; i++)
{
//这里需要注意的是不能用下面add=add+形式,因为三目运算符优先级不够
add +=i < a.size() ? a[i] == '1' : 0;
add += i < b.size() ? b[i] - '0' : 0;
//add = add + i < a.size() ? a[i] == '1' : 0;
//add = add + i < b.size() ? b[i] - '0' : 0;
result+=add % 2 + '0';
add = add / 2;
}
if (add > 0)
result += '1';
reverse(result.begin(), result.end());
return result;
}
};