> 技术文档 > LeetCode第67题_二进制求和_二进制求和算法题

LeetCode第67题_二进制求和_二进制求和算法题


LeetCode 第67题:二进制求和

题目描述

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

难度

简单

题目链接

点击在LeetCode中查看题目

示例

示例 1:

输入:a = “11”, b = “1”
输出:“100”
解释:11 + 1 = 100(二进制)

示例 2:

输入:a = “1010”, b = “1011”
输出:“10101”
解释:1010 + 1011 = 10101(二进制)

提示

  • 1 <= a.length, b.length <= 10^4
  • ab 仅由字符 \'0\'\'1\' 组成
  • 字符串如果不是 \"0\" ,就不含前导零

解题思路

模拟二进制加法

这道题的关键是模拟二进制加法的过程,需要注意以下几点:

  1. 从右向左遍历两个字符串
  2. 记录进位信息
  3. 处理不等长字符串的情况
  4. 最后检查是否还有进位

具体步骤:

  1. 初始化结果字符串和进位值
  2. 从后向前遍历两个字符串
  3. 计算当前位的和与进位
  4. 更新进位值和结果字符串
  5. 处理最后的进位情况

图解思路

算法步骤分析表

步骤 操作 状态 说明 初始 输入 a=“11”, b=“1” 原始输入 第1步 1+1 sum=2, carry=1 最右位相加 第2步 1+0+carry sum=2, carry=1 次右位加进位 第3步 0+0+carry sum=1, carry=0 处理最后进位

状态/情况分析表

情况 输入 输出 说明 基本情况 “11”+“1” “100” 有进位 无进位 “1”+“1” “10” 简单相加 多位进位 “111”+“111” “1110” 连续进位

代码实现

C# 实现

public class Solution { public string AddBinary(string a, string b) { StringBuilder result = new StringBuilder(); int carry = 0; int i = a.Length - 1; int j = b.Length - 1; // 从右向左遍历两个字符串 while (i >= 0 || j >= 0 || carry > 0) { int sum = carry; // 获取a的当前位 if (i >= 0) { sum += a[i] - \'0\'; i--; } // 获取b的当前位 if (j >= 0) { sum += b[j] - \'0\'; j--; } // 添加当前位的结果 result.Insert(0, sum % 2); // 更新进位 carry = sum / 2; } return result.ToString(); }}

Python 实现

class Solution: def addBinary(self, a: str, b: str) -> str: result = [] carry = 0 i = len(a) - 1 j = len(b) - 1 # 从右向左遍历两个字符串 while i >= 0 or j >= 0 or carry: total = carry # 获取a的当前位 if i >= 0: total += int(a[i]) i -= 1 # 获取b的当前位 if j >= 0: total += int(b[j]) j -= 1 # 添加当前位的结果 result.append(str(total % 2)) # 更新进位 carry = total // 2 return \'\'.join(result[::-1])

C++ 实现

class Solution {public: string addBinary(string a, string b) { string result; int carry = 0; int i = a.length() - 1; int j = b.length() - 1; // 从右向左遍历两个字符串 while (i >= 0 || j >= 0 || carry > 0) { int sum = carry; // 获取a的当前位 if (i >= 0) { sum += a[i] - \'0\'; i--; } // 获取b的当前位 if (j >= 0) { sum += b[j] - \'0\'; j--; } // 添加当前位的结果 result = to_string(sum % 2) + result; // 更新进位 carry = sum / 2; } return result; }};

执行结果

  • 执行用时:84 ms
  • 内存消耗:37.2 MB

代码亮点

  1. 🎯 使用StringBuilder优化字符串操作
  2. 💡 统一处理了字符串长度不等的情况
  3. 🔍 巧妙处理进位逻辑
  4. 🎨 代码结构清晰,易于理解

常见错误分析

  1. 🚫 没有处理进位情况
  2. 🚫 字符串长度处理错误
  3. 🚫 字符转数字计算错误
  4. 🚫 结果字符串拼接顺序错误

解法对比

解法 时间复杂度 空间复杂度 优点 缺点 字符串模拟 O(max(n,m)) O(max(n,m)) 直观易懂 需要额外空间 内置函数 O(n) O(1) 代码简短 不符合面试要求 位运算 O(n) O(1) 性能最优 实现复杂

相关题目

  • 字符串相加 - 简单
  • 数组形式的整数加法 - 简单
  • 两数相加 - 中等