刷爆力扣之二进制求和

刷爆力扣之二进制求和

HELLO,各位看官大大好,我是阿呆 ???

今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 ???

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jcAYfhES-1672147928147)(E:\2022年MD文档\LeetCode\我的刷题日记\字符串\刷爆力扣之二进制求和.assets\1672147909550.png)]

该专栏按照不同类别标签进行刷题,每个标签又分为 Easy、Medium、Hard 三个等级 ???

本部分所有题目均来自于LeetCode 网,并于每道题目下标明具体力扣网原题链接 ???

OK,兄弟们,废话不多直接上题,冲冲冲 ???


一 ? 题目描述

67. 二进制求和

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

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

输入:a = "1010", b = "1011"
输出:"10101"

提示:

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

二 ?破题思路

2.1 ? 关键信息

解决问题第一步,当然先提取题目字面上的关键信息 ???

二进制字符串 ab ,以二进制字符串的形式返回它们的和 = **【注意进位】**???


提取完题目中的关键信息后,直接进入第二阶段,思路整理 ???


2.2 ? 思路整理

分类讨论法

经典题型,对应解题模板

① 定义两个输入长度和进位,以及输出

② 遍历输入,直至两个输入都结尾

③ 获取两个输入当前位数据相加,分类讨论有进位则进位

④ 处理最终产生进位的情况

最后返回二进制字符串形式的和 ???


整理完解题思路后,直接进入第三阶段,代码实现 ???


三 ? 代码详解

3.1 ? 代码实现

按照我们刚才的破题思路,直接代码走起来 ????

string addBinary(string a, string b) {
    //定义当前位置索引, 获取两个输入字符串长度和进位
    int index = 1, aLen = a.size(), bLen = b.size(), carry = 0; 
    //初始化结果字符串
    std::string res = "";
    while (index <= aLen || index <= bLen) {
        char aChar = index <= aLen ? a[aLen - index] : '0'; //获取a当前字符
        char bChar = index <= bLen ? b[bLen - index] : '0'; //获取b当前字符
		
        //若两字符均为 '0', 根据有无进位, res 连接对应字符, 并将进位置 0
        if (aChar == bChar && aChar == '0') res += (carry == 0 ? '0' : '1'), carry = 0;
        //若两字符为一个 '0', 一个 '1', 根据有无进位, res 连接对应字符
        else if (aChar != bChar) res += (carry == 0 ? '1' : '0');
        //若两字符均为 '1', 根据有无进位, res 连接对应字符, 并将进位置 1
        else res += (carry == 0 ? '0' : '1'), carry = 1;
        ++index; //移动索引
    }

    if (carry == 1) res += '1'; //处理最终产生进位的情况
    reverse(res.begin(), res.end()); //反转字符串
    return res.size() != 0 ? res : "0"; //返回结果字符串
}

3.2 ? 细节解析

看完 ??? 全注释版的代码实现后,相信看官大大对整体逻辑已经是大写的 OK 了 ???

那么我们挖掘上述实现的晦涩细节 ??? 进行解析,直接开干,走起来 ????

if (aChar == bChar && aChar == '0') res += (carry == 0 ? '0' : '1'), carry = 0;

aChar == bChar && aChar == '0',进位必然为 0 ,所以将 carry 置为 0 ???


else if (aChar != bChar) res += (carry == 0 ? '1' : '0');

两字符为一个 0,一个 1 则,若 carry = 0res 连接 1carry 不变;若 carry = 1res 连接 0carry 不变 ???


四 ? 心路历程

为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈

博主在第一阶段提取 ? 关键信息没有问题,在第二阶段 ? 思路整理没有问题,上述实现和题解博主原创


五 ? 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 ???

如果各位看官大大觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! ???


版权声明:本文为qq_44868502原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。