力扣由浅至深 每日一题.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(); // 把结果反转并返回
    }
}
相关推荐
一只乔哇噻6 分钟前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
愚润求学7 分钟前
【贪心算法】day7
c++·算法·leetcode·贪心算法
要开心吖ZSH34 分钟前
软件设计师备考-(十六)数据结构及算法应用(重要)
java·数据结构·算法·软考·软件设计师
带娃的IT创业者1 小时前
如何开发一个教育性质的多线程密码猜测演示器
网络·python·算法
Aczone282 小时前
硬件(六)arm指令
开发语言·汇编·arm开发·嵌入式硬件·算法
luckys.one7 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|8 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师8 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo38 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC9 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模