LeetCode刷题笔记--67. Add Binary

该博客介绍了LeetCode第67题的解决方案,即如何对两个二进制字符串进行求和。作者首先分享了尝试将二进制字符串转换为整数进行计算导致溢出的问题,然后提供了两种直接使用字符串操作的方法,一种通过补零使两个字符串长度相同后进行逐位相加,另一种通过维护进位标志进行计算,最终得到了正确的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

67. Add Binary

Easy

814166FavoriteShare

Given two binary strings, return their sum (also a binary string).

The input strings are both non-empty and contains only characters 1 or 0.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"

这道题我转成int,会溢出,看来它是希望我直接用string来算。

出错的时候是这样的:

Last executed input:(这个testcase太狠了,有800多个位)


"10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"
"110101001011101110001111100110001010100001101

011101010000011011011001011101111001100000011011110011"

Line 15: Char 16: runtime error: signed integer overflow: 1347006986 * 2 cannot be represented in type 'int' (solution.cpp)

出错时代码如下:

class Solution {
public:
    string addBinary(string a, string b) {
        int i=a.length();
        int j=b.length();

        long long A=0;
        long long B=0;
        long long ans=0;
        string ans1="";
        string ans2="";
        
        for(int k=0;k<i;k++)
        {
            A=A*2+a[k]-'0';
        }
        for(int k=0;k<j;k++)
        {
            B=B*2+b[k]-'0';
        }
        ans=A+B;
        
        while(ans>0)
        {
            if(ans%2==1)ans1+='1';
            else ans1+='0';
            ans/=2;
        }
        
        int y;
        for(y=ans1.length()-1;y>=0;y--)
        {
            ans2+=ans1[y];
        }
        
        return ans2;
    }
};

 

然后我用直接string加又写了一遍,AC了。方法是先把ab两补成一样长,然后暴力加,得到ans1是倒着的,再倒一下就好了。

class Solution {
public:
    string addBinary(string a, string b) {
        int i=a.length();
        int j=b.length();
        int t0=0;
        string t="";
        string ans1="";
        string ans="";
        bool flag=false;
        if(i>j)
        {
            t0=i-j;
            for(int k=0;k<t0;k++)
            {t+='0';} 
            b=t+b;
        }
        else if(i<j)
        {
            t0=j-i;
            for(int k=0;k<t0;k++)
            {t+='0';} 
            a=t+a;
        }
        //现在两个string一样长了
        for(int k=a.length()-1;k>=0;k--)
        {
            if(a[k]!=b[k]&&flag)ans1+='0';
            else if(a[k]!=b[k]&&(!flag))ans1+='1';
            else if((a[k]==b[k])&&(a[k]=='0')&&(flag)){ans1+='1';flag=false;}
            else if((a[k]==b[k])&&(a[k]=='0')&&(!flag))ans1+='0';
            else if((a[k]==b[k])&&(a[k]=='1')&&(flag))ans1+='1';
            else if((a[k]==b[k])&&(a[k]=='1')&&(!flag)){ans1+='0';flag=true;}
        }
        if(flag)ans1+='1';
        for(int k=ans1.length()-1;k>=0;k--)
        {
            ans+=ans1[k];
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值