一 🏠 题目描述
67. 二进制求和
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a ="11", b ="1"输出:"100"
示例 2:
输入:a ="1010", b ="1011"输出:"10101"
提示:
1 <= a.length, b.length <=104a 和 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 连接对应字符, 并将进位置 0if (aChar == bChar && aChar =='0') res += (carry ==0 ? '0' : '1'), carry =0; //若两字符为一个 '0', 一个 '1', 根据有无进位, res 连接对应字符 elseif (aChar != bChar) res += (carry ==0 ? '1' : '0'); //若两字符均为 '1', 根据有无进位, res 连接对应字符, 并将进位置 1else 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 🐌🐌🐌
elseif (aChar != bChar) res += (carry ==0 ? '1' : '0');
两字符为一个 0,一个 1 则,若 carry = 0 ,res 连接 1, carry 不变;若 carry = 1 ,res 连接 0, carry 不变 🐳🐳🐳
四 🏠 心路历程
为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈
博主在第一阶段提取 🚀 关键信息没有问题,在第二阶段 🚀 思路整理没有问题,上述实现和题解博主原创