LeetCode 67. 二进制求和

LeetCode 67. 二进制求和

题目描述

给你两个二进制字符串 ab,以二进制字符串的形式返回它们的和。

示例 1:

复制代码
输入: a = "11", b = "1"
输出: "100"

示例 2:

复制代码
输入: a = "1010", b = "1011"
输出: "10101"

解题思路

二进制加法与十进制加法类似,从低位到高位逐位相加并处理进位。区别在于二进制是"逢二进一"。模拟竖式计算过程:

  • 用指针 ij 分别指向字符串 ab 的末尾(最低位)。
  • 用变量 carry 记录当前位的和及进位(初始为 0)。
  • ij 未越界,或仍有进位时循环:
    • i 未越界,将 a[i] 转换为数字加到 carry,左移 i
    • j 未越界,将 b[j] 转换为数字加到 carry,左移 j
    • 当前位结果为 carry % 2,转换为字符插入结果字符串。
    • 更新进位 carry = carry / 2
  • 反转结果字符串得到正确顺序。

巧妙之处:

  • 合并"当前位和"与"进位"为同一变量 carry
  • 循环条件覆盖所有情况(包括剩余进位)。
  • 单循环处理两字符串剩余部分。

代码实现

cpp 复制代码
class Solution {
public:
    string addBinary(string a, string b) {
        int i = a.size() - 1, j = b.size() - 1, carry = 0;
        string res;
        while (i >= 0 || j >= 0 || carry) {
            if (i >= 0) carry += a[i--] - '0';
            if (j >= 0) carry += b[j--] - '0';
            res.push_back(carry % 2 + '0');
            carry /= 2;
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

复杂度分析

  • 时间复杂度O(max(m, n)),需遍历两字符串各一次。
  • 空间复杂度O(max(m, n)),存储结果字符串所需空间。

示例演示

a = "11", b = "1" 为例:

步骤 i j carry(进入循环时) 操作 新 carry 当前位结果
初始化 1 0 0 - - -
第1次循环 1 0 0 a[1]=1carry=1b[0]=1carry=2 2 '0'
进位更新 - - - carry=2/2=1 1 -
第2次循环 0 -1 1 a[0]=1carry=2 j<0 不加 2 '0'
进位更新 - - - carry=2/2=1 1 -
第3次循环 -1 -1 1 i<0 不加 j<0 不加 1 '1'
进位更新 - - - carry=1/2=0 0 -

结果字符串依次存入 '0', '0', '1',反转后为 "100"

小结

本题是模拟竖式加法的经典问题。通过合并当前位和与进位,并利用循环条件简化代码。该思路可扩展至其他进制(如十进制、十六进制),仅需调整模数和除数。

复制代码
相关推荐
上海锟联科技2 小时前
DAS 与 FBG 振动监测对比:工程应用中该如何选择?
数据结构·算法·分布式光纤传感
星火开发设计2 小时前
模板参数:类型参数与非类型参数的区别
java·开发语言·前端·数据库·c++·算法
JialBro2 小时前
【嵌入式】直流无刷电机FOC控制算法全解析
算法·嵌入式·直流·foc·新手·控制算法·无刷电机
昌兵鼠鼠2 小时前
LeetCode Hot100 哈希
学习·算法·leetcode·哈希算法
忘梓.2 小时前
二叉搜索树·极速分拣篇」:用C++怒肝《双截棍》分拣算法,暴打节点删除Boss战!
开发语言·c++·算法
人工智能AI酱2 小时前
【AI深究】高斯混合模型(GMM)全网最详细全流程详解与案例(附Python代码演示) | 混合模型概率密度函数、多元高斯分布概率密度函数、期望最大化(EM)算法 | 实际案例与流程 | 优、缺点分析
人工智能·python·算法·机器学习·分类·回归·聚类
Aileen_0v02 小时前
【数据结构中链表常用的方法实现过程】
java·开发语言·数据结构·算法·链表·动态规划·csdn开发云
逻辑流2 小时前
《精准测量的起点:STM32中的电压电流有效值计算算法》
stm32·单片机·嵌入式硬件·算法
脏脏a2 小时前
【优选算法・双指针】以 O (n) 复杂度重构数组操作:从暴力遍历到线性高效的范式跃迁
算法·leetcode·双指针·牛客·优选算法