力扣由浅至深 每日一题.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(); // 把结果反转并返回
    }
}
相关推荐
学涯乐码堂主36 分钟前
有趣的“打擂台算法”
c++·算法·青少年编程·gesp
Tutankaaa1 小时前
知识竞赛题库设计全攻略
人工智能·算法
WolfGang0073212 小时前
代码随想录算法训练营 Day50 | 图论 part08
数据结构·算法·图论
aini_lovee3 小时前
多目标粒子群优化(MOPSO)双适应度函数MATLAB实现
人工智能·算法·matlab
yong99904 小时前
图像融合与拼接:完整MATLAB工具箱
算法·计算机视觉·matlab
春风不语5054 小时前
深入理解主成分分析(PCA)
算法
apollowing4 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶(二十二)
算法·启发式算法·web app
晚枫歌F4 小时前
最小堆定时器
数据结构·算法
Lumos_7774 小时前
Linux -- 线程
java·jvm·算法
七颗糖很甜5 小时前
“十五五”气象发展规划:聚焦五大核心任务
大数据·python·算法