Add Binary
這個題的意思比較明瞭,計算兩個字符串表示的二進制數的加法,可以參照示例看看,意思還是比清楚的。
我的思路是從右往左計算,將他們的和放到一個新的string中,其中最主要的是要處理進位,進位的處理需要一直處理,我分別舉出相應的例子說明一下吧:
(1). "10"+"11" 這兩個字符串一樣長,所以最後加完以後,最後的還有一個進位需要處理。
(2). "1" + "111"這兩個字符串長度不等,所以處理完一個字符串後還是需要單獨處理另一個字符串中考慮進位
最後需要做的是逆置字符串,這樣就得到了最終的結果
將進位的情況分析清楚的時候也就是你解答出此題的時候了,下面看看我的代碼吧。
class Solution {
public:
string addBinary(string a, string b)
{
string ret = "";
int len1 = a.size();
int len2 = b.size();
//空串
if (len1 == 0 && len2 == 0)
return ret;
//一空,一非空
if (len1 == 0)
return b;
if (len2 == 0)
return a;
//記錄進位信息,用於下一位的處理
int carrybit = 0;
while (len1 > 0 && len2 > 0)
{
int bit = a[len1 - 1] - '0' + b[len2 - 1] - '0';
if (carrybit == 1)
bit += 1;
//處理進位
if (bit > 1)
{
carrybit = 1;
bit %= 2;
ret.push_back(bit + '0');
}
else
{
carrybit = 0;
ret.push_back(bit + '0');
}
--len1;
--len2;
}
//兩個字符串很可能長度不等
while (len1--)
{
int bit = a[len1] - '0';
if (carrybit == 1)
bit += 1;
if (bit > 1)
{
carrybit = 1;
bit %= 2;
}
else
{
carrybit = 0;
}
ret.push_back(bit + '0');
}
while (len2--)
{
int bit = b[len2] - '0';
if (carrybit == 1)
bit += 1;
if (bit > 1)
{
carrybit = 1;
bit %= 2;
}
else
{
carrybit = 0;
}
ret.push_back(bit + '0');
}
//按照上面的思路,最後的進位沒有處理,需要單獨處理
if (len1 <= 0 && len2 <= 0)
{
if (carrybit == 1)
ret.push_back('1');
}
//逆序ret,得到正確的結果
int begin = 0;
int end = ret.size()-1;
while (begin < end)
swap(ret[begin++], ret[end--]);
return ret;
}
};