LeetCode做题笔记 - 67 - 二进制求和(简单)
题目:二进制求和(难度:简单)
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.
Example 1:
Input: a = "11", b = "1"
Output: "100"
Example 2:
Input: a = "1010", b = "1011"
Output: "10101"
思路
也许会想到先二进制转十进制,相加再转成二进制。但是因为题目的二进制数,没有保证大小,所以可能超出int范围。还是老老实实地从低位开始相加进位。
设一个标志表示进位。以较长的那个字符串为基础进行操作。
从最低位开始,向高位遍历。每一位有以下几种情况(进位表示从低位获得的进位):
- 1+1+进位:得1,并向高位进位
- 1+1:得0,并向高位进位
- 1+0+进位:得0,并向高位进位
- 1+0:得0,无进位
- 0+0+进位:得到1,无进位
- 0+0:得到0,无进位
当较短的字符串遍历到头后,如果无进位,则结束。若有进位,则继续遍历较长的字符串,处理进位。
如果较长的字符串遍历到头,而且仍有进位,则最高位之前再添加一位1。
代码
class Solution {
public:
string addBinary(string a, string b) {
bool carry = false; // 进位
int i = a.size()-1;
int j = b.size()-1;
string * base = i > j ? &a : &b; // 选择较长的作为基础
int * it = i > j ? &i : &j;
for (; i>=0 && j>=0; --i, --j)
{
if (a[i]=='1' && b[j]=='1')
{
(*base)[*it] = carry ? '1' : '0';
carry = true;
}
else if (a[i]=='0' && b[j]=='0')
{
(*base)[*it] = carry ? '1' : '0';
carry = false;
}
else // 0+1
{
(*base)[*it] = carry ? '0' : '1';
carry = carry ? true : false;
}
}
// 较短的遍历结束,仍有进位
while (carry && *it >= 0)
{
bool isZero = ((*base)[*it] == '0');
(*base)[*it] = isZero ? '1' : '0';
carry = isZero ? false : true;
--(*it);
}
// 较长的遍历结束,仍有进位
if (carry)
{
return (string(1, '1').append(*base));
}
return *base;
}
};

浙公网安备 33010602011771号