力扣由浅至深 每日一题.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(); // 把结果反转并返回
    }
}
相关推荐
夜天炫安全1 天前
数据结构中所需的C语言基础
c语言·数据结构·算法
2301_789015621 天前
DS进阶:AVL树
开发语言·数据结构·c++·算法
qyzm1 天前
天梯赛练习(3月13日)
开发语言·数据结构·python·算法·贪心算法
逆境不可逃1 天前
LeetCode 热题 100 之 64. 最小路径和 5. 最长回文子串 1143. 最长公共子序列 72. 编辑距离
算法·leetcode·动态规划
CoderCodingNo1 天前
【GESP】C++五级练习题 luogu-P1182 数列分段 Section II
开发语言·c++·算法
放下华子我只抽RuiKe51 天前
机器学习全景指南-直觉篇——基于距离的 K-近邻 (KNN) 算法
人工智能·gpt·算法·机器学习·语言模型·chatgpt·ai编程
kisshuan123961 天前
[特殊字符]【深度学习】DA3METRIC-LARGE单目深度估计算法详解
人工智能·深度学习·算法
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章33-Blod分析
图像处理·人工智能·opencv·算法·计算机视觉
Eward-an1 天前
LeetCode 239. 滑动窗口最大值(详细技术解析)
python·算法·leetcode
一叶落4381 天前
LeetCode 50. Pow(x, n)(快速幂详解 | C语言实现)
c语言·算法·leetcode