力扣由浅至深 每日一题.12 二进制求和

纵然生如逆旅多断肠,许我一苇坚韧以渡江

------ 24.3.23

[​​​​​​

二进制求和](https://leetcode.cn/problems/add-binary/ "​​​​​​二进制求和")

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

示例 1:

复制代码
输入:a = "11", b = "1"
输出:"100"

示例 2:

复制代码
输入:a = "1010", b = "1011"
输出:"10101"

提示:

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

解题思路

利用竖式的加法,十进制满十进一,二进制满二进一,遍历从后往前进行遍历,若有进位则长度需要加一,逢二进一,将前次遍历的结果进行判断,观察是否相加大于等于二,如果大于等于二,则需要向前进位

java 复制代码
class Solution {
    public String addBinary(String a, String b) {
        StringBuilder res = new StringBuilder(); // 返回结果
        int i = a.length() - 1; // 标记遍历到 a 的位置,从最后一位开始遍历
        int j = b.length() - 1; // 标记遍历到 b 的位置,从最后一位开始遍历
        int carry = 0; // 进位
        while (i >= 0 || j >= 0 || carry != 0) { // a 没遍历完,或 b 没遍历完,或进位不为 0
            int digitA = (i >= 0 ? a.charAt(i) - '0' : 0); // 当前 a 的取值
            int digitB = (j >= 0 ? b.charAt(j) - '0' : 0); // 当前 b 的取值
            int sum = digitA + digitB + carry; // 当前位置相加的结果
            carry = sum >= 2 ? 1 : 0; // 是否有进位
            sum = sum >= 2 ? sum - 2 : sum; // 去除进位后留下的数字
            res.append(sum); // 把去除进位后留下的数字拼接到结果中
            i --;  // 遍历到 a 的位置向左移动
            j --;  // 遍历到 b 的位置向左移动
        }
        return res.reverse().toString(); // 把结果反转并返回
    }
}
相关推荐
算AI1 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
hyshhhh3 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
杉之4 小时前
选择排序笔记
java·算法·排序算法
Naive_74 小时前
蓝桥杯准备(前缀和差分)
java·职场和发展·蓝桥杯
烂蜻蜓4 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf4 小时前
图论----拓扑排序
算法·图论
我要昵称干什么4 小时前
基于S函数的simulink仿真
人工智能·算法
AndrewHZ5 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl5 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦5 小时前
日期类的实现
数据结构·c++·算法