LeetCode--67

67. 二进制求和

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

输入:a = "1010", b = "1011"
输出:"10101"

提示:

  • 1 <= a.length, b.length <= 104
  • a 和 b 仅由字符 '0' 或 '1' 组成
  • 字符串如果不是 "0" ,就不含前导零

我使用的是最低级的方法,也就是先转化为十进制,然后进行十进制求和,之后再将结果转化为二进制。

代码如下:

class Solution {
public:
    string addBinary(string a, string b) {
        int lena=a.size();
        int anum=0;
        int bnum=0;
        int lenb=b.size();
        for(int i=0;i<lena;i++)
        {
            if(a[i]=='1')
            anum+=pow(2,lena-i-1);
        }
        for(int i=0;i<lenb;i++)
        {
            if(b[i]=='1')
            bnum+=pow(2,lenb-i-1);
        }
        int c=anum+bnum;
        string str;
        while(c>0)
        {
            if(c%2==1)
            str+="1";
            else
            str+="0";
            c=int(c/2);
        }
        reverse(str.begin(),str.end());
        if(str=="")
        str="0";
        return str;
    }
};

但是我的这种方法再处理比较长的二进制数据的时候,会遇到困难,长的二进制数据转化为十进制数处理时间较长。看看标准答案:

class Solution {
public:
    string addBinary(string a, string b) {
        string ans;
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());

        int n = max(a.size(), b.size()), carry = 0;
        for (size_t i = 0; i < n; ++i) {
            carry += i < a.size() ? (a.at(i) == '1') : 0;
            carry += i < b.size() ? (b.at(i) == '1') : 0;
            ans.push_back((carry % 2) ? '1' : '0');
            carry /= 2;
        }

        if (carry) {
            ans.push_back('1');
        }
        reverse(ans.begin(), ans.end());

        return ans;
    }
};

抱歉,看不懂,我使用chat一下。

算了,我们看一下更加简单易懂的解析吧:

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')
            {
                a[j]=(a[j]-'0')%2+'0';
                a[j-1]=a[j-1]+1;
            }
        }
        a[0]=a[0]-'0'+b[0];
        if(a[0]>='2')
        {
            a[0]=(a[0]-'0')%2+'0';
            a='1'+a;
        }
        return a;

    }
};

这里就单纯利用了二进制的加法计算,如果加上去之后数值大于1,就向前一位进一,在这里,数值位最大是3,利用2表示为0,3表示为1的特性进行计算。 最后再在最前面一位判断是否进行补加一位。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丘小羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值