每日leetcode[二进制求和]

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

输入为 非空 字符串且只包含数字 1 和 0

新增知识:

reverse函数:用于翻转字符串的顺序

at 函数:用于对字符串中的字符取值

push_back函数:向容器尾部添加元素

size_t 无符号整数: 在数组下标,字符数和内存管理函数之类的地方广泛使用,用于表示正整数,出现负数会报错

解题思路

题目要求返回二进制表示的数字,所以要观察两个二进制数相加的规律,是逢二进一,分为进位和本位和,由于字符串索引是从低位到高位,即从左向右,而二进制数的低位在右边,所以首先要对二进制数进行翻转,然后从低位开始遍历求和,注意两个二进制数可能不是同位数的,要取数字最大的长度,从低位对其开始相加,如果最高位的进位不为0,要进行添加到末尾,最后将得到的二进制数字进行翻转。

本位和: 两个数和上一位的进位数相加对2取模

和为1:为1

和为2:为0

和为3:为1

总结规律

进位数:两个数和上一位的进位数相加整除2

和为1:为1

和为2: 为1

和为3:为1

总结规律

代码:

class Solution {

public:

    string addBinary(string a, string b) {

        string ans;//设置新的二进制字符串

        reverse(a.begin(),a.end());

        reverse(b.begin(),b.end());//翻转两个二进制数于位数对应

        int l=max(a.size(),b.size());//取最大长度

        int k=0;//设定进位数字并初始化为0

        for(size_t i=0;i<l;i++)

        {

            k+=i<a.size()?(a.at(i)=='1'):0;//有点不是很清楚这里为什么要对取出的字符赋值

        if(i<b.size())

        {

          k+=i<b.size()?(b.at(i)=='1'):0;

        }

        

        if(k%2==1)

        {

        ans.push_back('1');

        }

        else

        {

          ans.push_back('0');//添加进位和

        }

        k/=2;//进位发生变化

     

    }

    if(k!=0)

    {

        ans.push_back('1');

    }

    reverse(ans.begin(),ans.end());//最后翻转

    return ans;

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值