Leetcode第67题 二进制求和 C++解法

给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。

照例先给出菜鸡想法,依次从末尾读入一个字符,然后转换为1、0求解,中间还多余考虑了某个字符长度较长的情况,但毫无疑问思路不够清晰

class Solution
{
public:
    string addBinary(string a, string b)
    {
        int count_a = a.size(), count_b = b.size();
        string result;
        map<char, int> map1 = {{'1', 1}, {'0', 0}};
        map<int, char> map2 = {{1, '1'}, {0, '0'}};
        result.resize(count_a > count_b ? count_a : count_b);
        int num = result.size() - 1;
        count_b--;
        count_a--;
        int add = 0;
        while (count_a >= 0 && count_b >= 0)
        {
            result[num] = map2[(map1[a[count_a]] + map1[b[count_b]] + add) % 2];
            add = (map1[a[count_a]] + map1[b[count_b]] + add) / 2;
            count_b--;
            count_a--;
            num--;
        }
        while (count_b >= 0)
        {
            result[num] = map2[(map1[b[num]] + add) % 2];
            add = (map1[b[num]] + add) / 2;
            num--;
        }
        while (count_a >= 0)
        {
            result[num] = map2[(map1[a[num]] + add) % 2];
            add = (map1[a[num]] + add) / 2;
            num--;
        }
        if (add == 1)
            result.insert(result.begin(), '1');
        return result;
    }
};

做之前其实我也想了,把字符长度补相同。相当于把后面的移到前面

class Solution
{
public:
    string addBinary(string a, string b)
    {
        int count_a = a.size(), count_b = b.size();
        while (count_a > count_b)
        {
            b = '0' + b;
            count_b++;
        }
        while (count_a < count_b)
        {
            a = '0' + a;
            count_a++;
        }
        string result;
        map<char, int> map1 = {{'1', 1}, {'0', 0}};
        map<int, char> map2 = {{1, '1'}, {0, '0'}};
        result.resize(count_a);
        count_a--;
        int add = 0;
        while (count_a >= 0)
        {
            result[count_a] = map2[(map1[a[count_a]] + map1[b[count_a]] + add) % 2];
            add = (map1[a[count_a]] + map1[b[count_a]] + add) / 2;
            count_a--;
        }
        if (add == 1)
            result = '1' + result;
        return result;
    }
};

但是还有问题,我解决字符相加的是用map去做的,之前想用判断去做,但是怕代码啰嗦,这个问题可以用条件运算符来做,我看到还有用字符向加减来做的,以及可以先把string反转过来,这样也不用设置它的大小了。
这个我觉得主要记住了STL通用reverse还有字符相加

#include <string>
class Solution
{
public:
    string addBinary(string a, string b)
    {
        string result;
        int num = a.size() > b.size() ? a.size() : b.size();
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        int add = 0;
        for (int i = 0; i < num; i++)
        {
  //这里需要注意的是不能用下面add=add+形式,因为三目运算符优先级不够
            add +=i < a.size() ? a[i] == '1' : 0;
            add += i < b.size() ? b[i] - '0' : 0;
            //add = add + i < a.size() ? a[i] == '1' : 0;
            //add = add + i < b.size() ? b[i] - '0' : 0;
            result+=add % 2 + '0';
            add = add / 2;
        }
        if (add > 0)
            result += '1';
        reverse(result.begin(), result.end());
        return result;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值