【每日算法C#】二进制求和 LeetCode

方法介绍

cs 复制代码
    public string AddBinary(string a, string b)
    {
        int i = a.Length - 1;
        int j = b.Length - 1;
        int carry = 0;
        string result = "";
        while (i >= 0 || j >= 0 || carry > 0)
        {
            int sum = carry;
            if (i >= 0)
            {
                sum += a[i] - '0';
                i--;
            }
            if (j >= 0)
            {
                sum += b[j] - '0';
                j--;
            }
            result = (sum % 2) + result;
            carry = sum / 2;
        }
        return result;
    }

这段代码实现的是两个二进制字符串的加法,返回它们的和(仍为二进制字符串)。以下是核心逻辑的总结:

  1. 输入 :两个二进制字符串 ab (例如 "1010""1011" )。
  2. 输出 :它们的二进制和(例如 "10101" )。
  3. 算法
    • 从字符串的末尾(最低位)开始逐位相加。
    • 使用 carry 记录进位。
    • 每次计算当前位的和( sum ),并更新进位( carry = sum / 2 )。
    • 将当前位的值( sum % 2 )拼接到结果字符串的左侧。

隐式转换说明

代码中涉及以下隐式转换(由编译器自动完成):

1. 字符到整数的转换
cs 复制代码
sum += a[i] - '0';
  • a[i] 是一个字符( '0''1' )。
  • '0' 的 ASCII 值是 48'1'49
  • a[i] - '0' 通过减法将字符隐式转换为整数:
    • '0' - '0' = 0
    • '1' - '0' = 1
2. 整数到字符的转换
cs 复制代码
result = (sum % 2) + result;
  • sum % 2 的结果是 01 (整数)。
  • 在与字符串 result 拼接时,整数被隐式转换为字符:
    • 0'0'
    • 1'1'
3. 整数除法的截断
cs 复制代码
carry = sum / 2;
  • sum / 2 是整数除法,结果会被截断为整数:
    • sum = 2 ,则 carry = 1
    • sum = 1 ,则 carry = 0

关键点分析

  1. 字符与整数的转换

    • 通过 - '0' 将字符 '0' / '1' 转换为整数 0 / 1 ,是二进制字符串处理的常见技巧。
    • 反向转换(整数 → 字符)通过字符串拼接自动完成。
  2. 进位逻辑

    • sum 的范围是 012 (因为每位相加的最大值是 1 + 1 + 1 = 3 )。
    • sum % 2 得到当前位的值, sum / 2 得到进位值。
  3. 字符串拼接的方向

    • 结果是从最低位开始构建的,因此每次拼接在字符串的左侧result = (sum % 2) + result )。

示例演示

a = "1010" (十进制 10)和 b = "1011" (十进制 11)为例:

  1. 初始状态
    • i = 3 , j = 3 , carry = 0 , result = ""
  2. 逐步计算
    • 第一轮: sum = 0 + 0 + 1 = 1result = "1" , carry = 0
    • 第二轮: sum = 0 + 1 + 1 = 2result = "01" , carry = 1
    • 第三轮: sum = 1 + 0 + 0 = 1result = "101" , carry = 0
    • 第四轮: sum = 0 + 1 + 1 = 2result = "0101" , carry = 1
    • 第五轮: sum = 1result = "10101" , carry = 0
  3. 结果
    • "10101" (十进制 21)。

优化建议

  1. 使用 StringBuilder

    • 当前方法通过字符串拼接效率较低,建议改用 StringBuilderInsert(0, value) 方法。

    • 示例:

      cs 复制代码
      var sb = new StringBuilder();
      sb.Insert(0, sum % 2);
  2. 边界条件处理

    • 如果输入为空字符串,可以直接返回另一个字符串:csharp

      插入

      复制

      新建文件

      保存

      应用代码

      cs 复制代码
      if (string.IsNullOrEmpty(a)) return b;
      if (string.IsNullOrEmpty(b)) return a;

总结

  • 隐式转换:通过字符与整数的加减实现类型转换,是二进制字符串处理的核心技巧。
  • 算法效率 :时间复杂度为 O(n)n 是较长字符串的长度),但字符串拼接部分可以优化。
  • 适用场景:适用于任意长度的二进制字符串加法。
相关推荐
小O的算法实验室21 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
周杰伦fans1 天前
C# required 关键字详解
开发语言·网络·c#
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能1 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo1 天前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法