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) 性能最优 实现复杂

相关题目

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

你可能感兴趣的:(算法,leetcode,算法,职场和发展,矩阵,数据结构,python,c++)