lintcode add-binary 二进制求和

问题描述

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

样例
a = 11

b = 1

返回 100

笔记

  • 可以先把两个数reverse,然后在头部插入结果,也可以先在尾部插入结果,最后再把结果reverse,从代码简洁程度来看似乎第一种比较简洁。

  • 要注意最后把carry加进去结果中。

代码

class Solution {
public:
    /**
     * @param a a number
     * @param b a number
     * @return the result
     */
    string addBinary(string& a, string& b) {
        // Write your code here
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        string res;
        int carry = 0;
        int ia = 0;
        int ib = 0;
        int lena = int(a.size());
        int lenb = int(b.size());
        while (ia < lena || ib < lenb)
        {
            int nowa = (ia < lena) ? a[ia] - '0' : 0;
            int nowb = (ib < lenb) ? b[ib] - '0' : 0;
            int tmp = nowa + nowb + carry;
            carry = tmp / 2;
            res.insert(res.begin(), tmp % 2 + '0');
            ia++;
            ib++;
        }
        if (carry)
            res.insert(res.begin(), '1');
        return res;
    }
};

第二次写又写出另外一种,思路还是差不多吧

class Solution {
public:
    /**
     * @param a a number
     * @param b a number
     * @return the result
     */
    string addBinary(string& a, string& b) {
        // Write your code here
        const int lena = a.size();
        const int lenb = b.size();
        int ia = lena - 1;
        int ib = lenb - 1;
        int carry = 0;
        string res;
        while (ia >= 0 && ib >= 0)
        {
            int tmp = a[ia] - '0' + b[ib] - '0' + carry;
            res.push_back(tmp % 2 + '0');
            carry = tmp / 2;
            ia --;
            ib --;
        }
        while (ia >= 0)
        {
            int tmp = a[ia] - '0' + carry;
            res.push_back(tmp % 2 + '0');
            carry = tmp / 2;
            ia --;
        }
        while (ib >= 0)
        {
            int tmp = b[ib] - '0' + carry;
            res.push_back(tmp % 2 + '0');
            carry = tmp / 2;
            ib --;
        }
        if (carry)
            res.push_back(carry + '0');
        reverse(res.begin(), res.end());
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值