大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。
题目考察的知识点
这道题目考察的知识点是字符串的处理和二进制运算。
题目解答方法的文字分析
给定两个表示二进制数的字符串 a 和 b,要求计算它们的和,并以二进制字符串形式返回。
思路一:我们可以从字符串的最右端(最低位)开始遍历,逐位相加,并记录进位。具体步骤如下:
- 初始化两个指针 i 和 j 分别指向字符串 a 和 b 的最右端(即个位数的位置)。
- 初始化一个变量 carry 表示进位,初始值为 0。
- 创建一个空字符串 res,用于存放结果。
- 从右往左遍历 a 和 b 的字符:取出当前位上的数字(如果已经超出字符串长度,则认为当前位上的数字为 0)。将当前位上的数字与进位 carry 相加,得到 sum。sum 对 2 取余,结果即为当前位上的数字。sum 对 2 取商,结果即为进位 carry。将当前位上的数字插入到结果字符串 res 的最前面。
- 当遍历完 a 和 b 的所有位后,如果进位 carry 不为 0,则将 carry 插入到结果字符串 res 的最前面。
思路二(优化):在思路一的基础上,我们可以优化空间复杂度。不需要使用额外的字符串来存放结果,可以直接在输入字符串上进行修改。具体步骤如下:
- 将字符串 a 的长度扩展到和字符串 b 的长度相等,较短的字符串高位补零。
- 从右往左遍历 a 和 b 的字符:取出当前位上的数字(如果已经超出字符串长度,则认为当前位上的数字为 0)。将当前位上的数字与进位 carry 相加,得到 sum。sum 对 2 取余,结果即为当前位上的数字。sum 对 2 取商,结果即为进位 carry。将当前位上的数字替换原来的字符。
- 当遍历完 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!