67. 二进制求和
目录
一、问题描述
二、解题思路
三、代码
四、复杂度分析
一、问题描述
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
二、解题思路
-
反向遍历:二进制加法从最低位(右端)开始计算
-
进位处理:每位相加结果可能产生进位,需保存至下一位计算
-
统一处理:当两字符串长度不同时,短字符串高位视为0
-
结果拼接:计算结果按低位到高位顺序生成,需反转得到最终结果
三、代码
class Solution {
public:string addBinary(string a, string b) {int i = a.size() - 1,j = b.size() - 1; //初始化指针,使其指向字符串a和b的末尾int carry = 0; //进位值(0|1)string result; //存储计算结果//当任意字符串有未处理的位或存在进位时继续循环while(i >= 0 || j >= 0 || carry > 0){//获取当前位的值(若指针越界则视为0)int a_val = (i >= 0) ? a[i--] - '0' : 0; //字符转数字后指针左移int b_val = (j >= 0) ? b[j--] - '0' : 0;int sum = a_val + b_val + carry; //计算当前位的总和(包含进位)result.push_back((sum % 2) + '0'); //取模得当前位置,转字符存入结果carry = sum / 2; //计算新的进位}reverse(result.begin(),result.end()); //反转字符串,得到高位在前的结果return result;}
};
四、复杂度分析
时间复杂度:O(max(M, N)),其中 M 和 N 分别为字符串 a 和 b 的长度。需要遍历两个字符串的全部位数。
空间复杂度:O(max(M, N)),存储结果的字符串长度最多为 max(M, N) + 1(进位情况)