刷爆力扣之二进制求和
HELLO,各位看官大大好,我是阿呆 🙈🙈🙈
今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜
该专栏按照不同类别标签进行刷题,每个标签又分为 Easy、Medium、Hard 三个等级 👊👊👊
本部分所有题目均来自于LeetCode 网,并于每道题目下标明具体力扣网原题链接 🏃🏃🏃
OK,兄弟们,废话不多直接上题,冲冲冲 🌞🌞🌞
一 🏠 题目描述
67. 二进制求和
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1"
输出:"100"
示例 2:
输入:a = "1010", b = "1011"
输出:"10101"
提示:
1 <= a.length, b.length <= 104
a
和b
仅由字符'0'
或'1'
组成- 字符串如果不是
"0"
,就不含前导零
二 🏠破题思路
2.1 🚀 关键信息
解决问题第一步,当然先提取题目字面上的关键信息 😎😎😎
二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和 = **【注意进位】**🌸🌸🌸
提取完题目中的关键信息后,直接进入第二阶段,思路整理 😃😃😃
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 = 0
,res
连接 1
, carry
不变;若 carry = 1
,res
连接 0
, carry
不变 🐳🐳🐳
四 🏠 心路历程
为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈
博主在第一阶段提取 🚀 关键信息没有问题,在第二阶段 🚀 思路整理没有问题,上述实现和题解博主原创
五 🏠 结语
身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍
如果各位看官大大觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力
博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪