LeetCode 第67题:二进制求和

122 阅读3分钟

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+1sum=2, carry=1最右位相加
第2步1+0+carrysum=2, carry=1次右位加进位
第3步0+0+carrysum=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)性能最优实现复杂

相关题目