LeetCode:67.二进制求和

67.二进制求和


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

方法一:暴力破解

设置两个指针,分别从两个字符串的尾部往前遍历,每遍历一个字符时,将该字符转换成数字进行相加操作,并判断是否需要进位,并对相加结果对2进行取余,将结果作为字符拼接到最终的结果字符串中。

代码实现
string addBinary(string a, string b) {
    string sRes = "";
    int nIndexA = a.size() - 1;
    int nIndexB = b.size() - 1;
    int nCrayy = 0;
    while (nIndexA >= 0 && nIndexB >= 0) {
      int nAdd = nCrayy + a[nIndexA] + b[nIndexB] - '0' - '0';
      nCrayy = nAdd / 2;
      nAdd %= 2;
      char  cAdd = nAdd + '0';
      sRes = cAdd + sRes;

      nIndexA--;
      nIndexB--;
    }

    for (; nIndexA >= 0; nIndexA--) {
      int nAdd = nCrayy + a[nIndexA] - '0';
      nCrayy = nAdd / 2;
      nAdd %= 2;
      char  cAdd = nAdd + '0';
      sRes = cAdd + sRes;
    }
    for (; nIndexB >= 0; nIndexB--) {
      int nAdd = nCrayy + b[nIndexB] - '0';
      nCrayy = nAdd / 2;
      nAdd %= 2;
      char  cAdd = nAdd + '0';
      sRes = cAdd + sRes;
    }
    if (nCrayy) {
      char c = nCrayy + '0';
      sRes = c + sRes;
    }

    return sRes;
  }

时间复杂度: O ( max ⁡ ( m , n ) ) O(\max(m,n)) O(max(m,n))
空间复杂度: O ( 1 ) O(1) O(1)


哈哈哈哈哈,刷题只会暴力求解。


LeetCode题解

leetcode题解采用的思想也是列竖式的方法,末尾对齐,逐位相加。leetcode题解所用的方法中首先将字符串首尾反转,在字符串 ab 中较短的一个高位补 0 0 0。每次遍历时将对应位置的答案依次存入答案字符串中,最终将答案反转。

leetcode题解中每次判断需要进行相加的数字时,采用 if 语句进行判断,这种只是基于二进制数字中只存在 0 0 0 1 1 1 两个数字的情况,如果遇到多余两个数字的情况,则需要较多的 if 语句来进行判断。

代码实现
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;
    }
};

时间复杂度: O ( max ⁡ ( m , n ) ) O(\max(m,n)) O(max(m,n))

空间复杂度: O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值