当前位置: 首页 > news >正文

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

方法介绍

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

隐式转换说明

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

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

关键点分析

  1. 字符与整数的转换

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

    • sum 的范围是 0 、 1 或 2 (因为每位相加的最大值是 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 = 1 → result = "1" , carry = 0 。
    • 第二轮: sum = 0 + 1 + 1 = 2 → result = "01" , carry = 1 。
    • 第三轮: sum = 1 + 0 + 0 = 1 → result = "101" , carry = 0 。
    • 第四轮: sum = 0 + 1 + 1 = 2 → result = "0101" , carry = 1 。
    • 第五轮: sum = 1 → result = "10101" , carry = 0 。
  3. 结果
    • "10101" (十进制 21)。

优化建议

  1. 使用 StringBuilder 

    • 当前方法通过字符串拼接效率较低,建议改用 StringBuilder 的 Insert(0, value) 方法。
    • 示例:
      var sb = new StringBuilder();
      sb.Insert(0, sum % 2);
      
  2. 边界条件处理

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

      插入

      复制

      新建文件

      保存

      应用代码

      if (string.IsNullOrEmpty(a)) return b;
      if (string.IsNullOrEmpty(b)) return a;
      

总结

  • 隐式转换:通过字符与整数的加减实现类型转换,是二进制字符串处理的核心技巧。
  • 算法效率:时间复杂度为 O(n) ( n 是较长字符串的长度),但字符串拼接部分可以优化。
  • 适用场景:适用于任意长度的二进制字符串加法。
http://www.dtcms.com/a/414641.html

相关文章:

  • 小九源码-springboot055-基于Java WEB旅游门票信息系统
  • CmBacktrace故障排查全攻略
  • Git注意事项
  • 类似于wordpress的网站网站建设需要花多少钱
  • pc网站怎么做wordpress编辑器百度
  • 瑞丽市建设局网站餐厅网站建设文案书
  • 如何给网站做下载附件专业商城网站建设价格低
  • 【解决方案】开始菜单-程序Programs目录为空导致utools无法打开cmd和控制面板解决方法
  • Go语言数据结构和算法(七)字符串匹配算法
  • 关于机器人的物理结构(连杆、关节、执行器)的快速入门介绍
  • C++进阶(1)——继承
  • 极简 Python 语言教程:从 Java 开发者视角入门实战
  • js 设计模式
  • Element前端黑马案例
  • ThingsBoard部署APP问题-GitHub无法访问
  • Day 27 - 使用 Tkinter 构建图形界面 (GUI) 与高级函数参数 - Python学习笔记
  • 学习Java第二十三天——苍穹外卖Day11-01~18
  • Cap‘n Web - JavaScript原生RPC系统
  • 东山县建设局网站烟台网站制作维护
  • 北京南站到北京站坐地铁几号线php+mysql网站开发技术与典型案例导航【源代码】
  • 使用Dlib库实现人脸识别,比opencv更加好用
  • Java RSA非对称加密与数字签名的安全数据传输
  • 【视觉SLAM十四讲】视觉里程计 1
  • Gnirehtet 教程:USB 数据线 电脑网络 反共享 Android设备
  • STM32启动流程解析:从BootROM到BootLoader
  • 网站文件目录wordpress find
  • 【Android之路】界面和状态交互
  • xget下载加速
  • 丝绸之路网站建设策划书如何用vc做网站
  • 【leetcode】35. 搜索插入位置