剑指 Offer II 002. 二进制加法解题心得记录

剑指 Offer II 002. 二进制加法解题心得

给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。

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

示例 1:
输入: a = “11”, b = “10”
输出: “101”

示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”

提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/JFETK5

自解思路:二进制加法运算,是从低位往高位对位相加,对位相加时是否有进位,若有,则参与下一位的加法运算。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

string myAddBinary(string a, string b)
{
//加法运算需从低到高,对字符倒序,方便对位运算
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());

int countA = a.size();
int countB = b.size();
string ret;

bool flag = false;

for(int i=0; i < countA; ++i)
{
    if(i > countB - 1)//当加法运算完短串时,后面的值就只与是否有进位有关
    {
        if(flag)
        {
        	//当有进位时,与当前值相加
            if(a[i] == '1')
            {
            //加1为0,产生进位
                ret += '0';
                flag = true;
            }
            else
            {
            //加0为1,无进位产生
                ret += '1';
                flag = false;
            }
        }
        else
        {
         //无进位时,值为本身
            ret += a[i];
        }
    }
    else
    {
        if(flag)
        {
            if(a[i] == b[i])
            {
                 //若对位相等,则此位两数相加值为0,若两数为1,则有进位,反之则无。
      			 //加上进位则固定为1
                ret += '1';
                flag = a[i] == '1' ? true : false;
            }
            else
            {
                  //若对位不相等,则此位两数相加值则固定为1
      			 //加上进位则固定为0,产生进位
                ret += '0';
                flag = true;
            }
        }
        else
        {
            if(a[i] == b[i])
            {
             //若对位相等,则此位两数相加值为0,若两数为1,则有进位,反之则无。
                ret += '0';
                flag = a[i] == '1' ? true : false;
            }
            else
            {
             //若对位不相等,则此位两数相加值则固定为1
                ret += '1';
                flag = false;
            }
        }
    }

}

//最后若有进位,则加在最高位
if(flag)
    ret += '1';
//计算是从低位开始,最终结果需倒序
reverse(ret.begin(), ret.end());
return ret;

}

string addBinary(string a, string b) {
if(a.size() < b.size())//将最长串固定在第一个输入
{
    return myAddBinary(b, a);
}
else
{
    return myAddBinary(a, b);
}
}

你可能感兴趣的:(leetcode,算法)