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"

小结

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

复制代码
相关推荐
xlp666hub1 天前
Leetcode第一题:用C++解决两数之和问题
c++·leetcode
ZhengEnCi1 天前
08c. 检索算法与策略-混合检索
后端·python·算法
程序员小崔日记1 天前
大三备战考研 + 找实习:我整理了 20 道必会的时间复杂度题(建议收藏)
算法·408·计算机考研
lizhongxuan1 天前
AI小镇 - 涌现
算法·架构
AI工程架构师1 天前
通常说算力是多少 FLOPS,怎么理解,GPU和CPU为什么差异这么大
算法
祈安_1 天前
Java实现循环队列、栈实现队列、队列实现栈
java·数据结构·算法
归去_来兮2 天前
拉格朗日插值算法原理及简单示例
算法·数据分析·拉格朗日插值
千寻girling2 天前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
颜酱2 天前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
CoovallyAIHub3 天前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉