Add Binary
思路
自己愚蠢的思路:暴力进制转换,利用十进制相加后再次进行转换
大佬:二进制求和,满二进一
1.首先让两个字符串等长,若不等长,在短的字符串前补零,否则之后的操作会超出索引。
2.然后从后到前遍历所有的位数,同位相加,这里有一个点,用的是字符相加,利用 ASCII 码,字符在内部都用数字表示,我们不需要知道具体数值,但可知 ‘0’-‘0’ = 0, ‘0’+1=‘1’,以此类推 。字符的加减,大小比较,实际上都是内部数字的加减,大小比较
3.判断相加后的字符,若大于等于字符 ‘2’,下一位需要进一
4.第 0 位数的相加在这里是单独处理的,因为它可能涉及到字符的插入(即是否需要在最前面加一位数 ‘1’)
【作者:youlookdeliciousc
链接:https://leetcode-cn.com/problems/add-binary/solution/c-xiang-xi-ti-jie-bu-zou-qing-xi-by-youlookdelicio/ 来源:力扣(LeetCode)】
一些语法
1.string也可以直接用.size()来求其长度
2.string和string可以直接相加减
其他
1.ASCII码中数字的如下图:
(二进制|十进制|十六进制|图形)
代码
class Solution {
public:
string addBinary(string a, string b) {
int len_a=a.size();
int len_b=b.size();
while(len_a>len_b){
b='0'+b;//直接在前面加一位
len_b++;
}
while(len_a<len_b){
a='0'+a;//直接在前面加一位
len_a++;
}
for(int i=len_a-1;i>0;i--)
{
a[i]=a[i]-'0'+b[i];//算出a[i]和‘0’之间相差的整数,再加给b[i]
while(a[i]>='2'){//因为a[i]是字符
a[i]=a[i]-'2'+'0';//同样的,前面算出了差值,后面得加上
a[i-1]=a[i-1]+1;//这里可以直接加上
}
}
a[0]=a[0]-'0'+b[0];//算出a[0]和‘0’之间相差的整数,再加给b[0]
if(a[0]>'1')//注意是字符
{
a='1'+a;//在a前面加一位
a[1]=a[1]-'2'+'0';//和上面一样
}
return a;
}
};
注意在加减的地方,因为是ASCLL码,注意是加减数字还是字符