大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

这道题目考察的知识点是字符串的处理和二进制运算。

题目解答方法的文字分析

给定两个表示二进制数的字符串 a 和 b,要求计算它们的和,并以二进制字符串形式返回。

思路一:我们可以从字符串的最右端(最低位)开始遍历,逐位相加,并记录进位。具体步骤如下:

  1. 初始化两个指针 i 和 j 分别指向字符串 a 和 b 的最右端(即个位数的位置)。
  2. 初始化一个变量 carry 表示进位,初始值为 0。
  3. 创建一个空字符串 res,用于存放结果。
  4. 从右往左遍历 a 和 b 的字符:取出当前位上的数字(如果已经超出字符串长度,则认为当前位上的数字为 0)。将当前位上的数字与进位 carry 相加,得到 sum。sum 对 2 取余,结果即为当前位上的数字。sum 对 2 取商,结果即为进位 carry。将当前位上的数字插入到结果字符串 res 的最前面。
  5. 当遍历完 a 和 b 的所有位后,如果进位 carry 不为 0,则将 carry 插入到结果字符串 res 的最前面。

思路二(优化):在思路一的基础上,我们可以优化空间复杂度。不需要使用额外的字符串来存放结果,可以直接在输入字符串上进行修改。具体步骤如下:

  1. 将字符串 a 的长度扩展到和字符串 b 的长度相等,较短的字符串高位补零。
  2. 从右往左遍历 a 和 b 的字符:取出当前位上的数字(如果已经超出字符串长度,则认为当前位上的数字为 0)。将当前位上的数字与进位 carry 相加,得到 sum。sum 对 2 取余,结果即为当前位上的数字。sum 对 2 取商,结果即为进位 carry。将当前位上的数字替换原来的字符。
  3. 当遍历完 a 和 b 的所有位后,如果进位 carry 不为 0,则在 a 字符串最前面插入 carry。

本题解析所用的编程语言

本题解析所用的编程语言是 C++。

完整且正确的编程代码

#include <string>
using namespace std;

class Solution {
public:
    string addBinary(string a, string b) {
        // 将字符串 a 的长度扩展到和字符串 b 的长度相等,较短的字符串高位补零
        int diff = b.size() - a.size();
        if (diff > 0) {
            a = string(diff, '0') + a;
        } else {
            b = string(-diff, '0') + b;
        }

        int carry = 0; // 进位
        for (int i = a.size() - 1; i >= 0; --i) {
            int sum = (a[i] - '0') + (b[i] - '0') + carry;
            a[i] = sum % 2 + '0'; // 当前位上的数字
            carry = sum / 2;      // 进位
        }

        if (carry != 0) {
            a.insert(a.begin(), carry + '0');
        }

        return a;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!