题目
二进制求和
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
思路
(1)python 用内置函数bin(将十进制转为二进制)一行代码搞定
python3代码1
class Solution:
def addBinary(self, a: str, b: str) -> str:
return(bin(int(a,2),int(b,2))[2:])
(2)
思路:这是一种古老的经典算法,无需把数字转换成十进制,直接逐位计算和与进位即可。
初始进位 carry = 0,如果数字 a 的最低位是 1,则将 1 加到进位 carry;同理如果数字 b 的最低位是 1,则也将 1 加到进位。
然后将carry 的最低位作为最低位的值,将carry 的最高位移至下一位继续计算。
重复上述步骤,直到数字 a 和 b 的每一位计算完毕。最后如果 carry 的最高位不为 0,则将最高位添加到计算结果的末尾。最后翻转结果得到求和结果。
class Solution:
def addBinary(self, a: str, b: str) -> str:
n=max(len(a),len(b))
a,b=a.zfill(n),b.zfill(n)
carry=0
answer=[]
for i in range(n-1,-1,-1):
if(a[i]=='1'):
carry+=1
if(b[i]=='1'):
carry+=1
if(carry%2==1):
answer.append('1')
else:
answer.append('0')
carry//=2
if (carry==1):
answer.append('1')
answer.reverse()
return ''.join(answer)
c++代码
思路 :
(1)首先和上边的思路一样,让a,b两个字符串等长。方便遍历,运算;
(2):从后往前遍历第a[1]位,同位相加,利用ascii码进行字符加减。
(3):判断a[0]和b[0]相加是否>=2 是、如果是,则需要字符串前加一位 ‘1’.
这个代码实现起来的空间复杂度为O(1)
class Solution {
public:
string addBinary(string a, string b) {
int al = a.size();
int bl = b.size();
while(al < bl) //让两个字符串等长,若不等长,在短的字符串前补零,否则之后的操作会超出索引
{
a = '0' + a;
++ al;
}
while(al > bl)
{
b = '0' + b;
++ bl;
}
for(int j = a.size() - 1; j > 0; -- j) //从后到前遍历所有的位数,同位相加
{
a[j] = a[j] - '0' + b[j];
if(a[j] >= '2') //若大于等于字符‘2’,需要进一
{
a[j] = (a[j] - '0') % 2 + '0';
a[j-1] = a[j-1] + 1;
}
}
a[0] = a[0] - '0' + b[0]; //将ab的第0位相加
if(a[0] >= '2') //若大于等于2,需要进一
{
a[0] = (a[0] - '0') % 2 + '0';
a = '1' + a;
}
return a;
}
};