一. 这题估计被我写复杂了,但是想法比较简单.
class Solution {
public:
string addBinary(string a, string b) {
stack<char> tmp;
int i = a.length() - 1, j = b.length() - 1, cc = 0;
//x和y代表当前位置上的值是多少.
int x,y;
//因为两个二进制字符串长度不一定相等.
while (i >= 0 || j >= 0) {
//如果短的字符串小于0了,
//就在他的前面补0.
if (i < 0) x = 0;
//因为a和b是字符串,
//所以需要减去'0'的ascii值得到数字.
else x = a[i] - '0';
if (j < 0) y = 0;
else y = b[j] - '0';
//如果加上进位大于等于2,也有可能是3.
if (x + y + cc >= 2) {
if(x + y + cc == 2){
//压栈.
tmp.push('0');
cc = 1;
}
else{
tmp.push('1');
cc = 1;
}
}
else {
if (x + y + cc == 0) tmp.push('0');
else tmp.push('1');
cc = 0;
}
//同时更新i和j,去计算下一位的值.
i--; j--;
}
//如果还有进位,则再push一个1.
if (cc == 1) {
tmp.push('1');
}
string res = "";
//这里解释下为何用栈这种数据结构,
//因为加法是从字符串尾部往前加,
//赋值字符串时从头开始赋值,符合后进先出,
//先进后出.
while (!tmp.empty()) {
res += tmp.top();
tmp.pop();
}
return res;
}
};
不过时间还是挺可以的..........
二. 参考一下大神的解法,对比一下.
作者:guanpengchn
链接:https://leetcode-cn.com/problems/add-binary/solution/hua-jie-suan-fa-67-er-jin-zhi-qiu-he-by-guanpengch/
思路
1. 整体思路是将两个字符串较短的用 0 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果。
2. 本题解中大致思路与上述一致,但由于字符串操作原因,不确定最后的结果是否会多出一位进位,所以会有 2 种处理方式:
3. 第一种,在进行计算时直接拼接字符串,会得到一个反向字符,需要最后再进行翻转.
4. 第二种,按照位置给结果字符赋值,最后如果有进位,则在前方进行字符串拼接添加进位.
时间复杂度:O(n)
class Solution {
public:
string addBinary(string a, string b) {
string ans;
int cc = 0, i = a.size() - 1, j = b.size() - 1;
while (i >= 0 || j >= 0)
{
int sum = cc;
sum += (i >= 0 ? a[i--] - '0' : 0);
sum += (j >= 0 ? b[j--] - '0' : 0);
//利用to_string将数字转换成字符串.
//利用stoi将字符串转换为数字.
//类似十进制取个位十位,这里是二进制.
ans += to_string(sum % 2);
cc = sum / 2;
}
//判断最后需不需要补1.
ans += (cc == 0 ? "" : "1");
//反转字符串.
reverse(ans.begin(), ans.end());
return ans;
}
};