【每日一题033】leetcode-67
目录
- 题目
- 思路
- 相关思考
- 代码(C++/力扣)
题目
题目来源
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
思路
1.转化为数字做,但是溢出了…放弃
2.按照评论中模拟全加器进行加减
相关思考
int类型转换为char类型需要+‘0’转换,且需要考虑首位也产生进位的情况
代码(C++/力扣)
class Solution {
public:
string addBinary(string a, string b) {
string res="";
int la=a.length(),lb=b.length(),lm=max(la,lb);
//加前导零对齐
for(int i=la;i<lm;i++) a="0"+a;
for(int i=lb;i<lm;i++) b="0"+b;
//进位
int carry=0;
//模拟全加器,分别计算结果和进位值
for(int i=lm-1;i>=0;i--){
/*两位是a,b,上一位进位是c0,这一位进位是c,结果是s
**s=a^b^c0
**c=a&b|(c0&(a^b))
*/
char temp=(a[i]-'0')^(b[i]-'0')^(carry)+'0';
carry=((a[i]-'0')&(b[i]-'0'))|(carry&((a[i]-'0')^(b[i]-'0')));
res=temp+res;
}
//如果算完还有进位,需要补个1
if(carry==1)
res="1"+res;
return res;
}
};