面试算法之一(2)锻炼编程思维(c++ and python)

题目

二进制求和
给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值