刷爆力扣之二进制求和

简介: 刷爆力扣之二进制求和

一 🏠 题目描述

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 不变 🐳🐳🐳



四 🏠 心路历程

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


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


相关文章
|
6月前
|
索引
【力扣刷题】两数求和、移动零、相交链表、反转链表
【力扣刷题】两数求和、移动零、相交链表、反转链表
46 2
【力扣刷题】两数求和、移动零、相交链表、反转链表
|
3月前
|
算法 Java
LeetCode第67题二进制求和
这篇文章是关于LeetCode第67题二进制求和的解题思路和代码实现的分享。作者通过分析题目要求和二进制加法的规则,提供了一个Java语言的解决方案,并在最后总结了二进制在算法中的重要性。
LeetCode第67题二进制求和
|
5月前
|
存储 SQL 算法
LeetCode题目67:二进制求和
LeetCode题目67:二进制求和
|
5月前
|
算法 Java Go
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
【经典算法】LeetCode 67. 二进制求和(Java/C/Python3/Golang实现含注释说明,Easy)
62 2
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
【经典LeetCode算法题目专栏分类】【第4期】BFS广度优先算法:单词接龙、最小基因变化、二进制矩阵中的最短路径
|
6月前
【力扣】67. 二进制求和
【力扣】67. 二进制求和
|
6月前
LeetCode[题解] 2864. 最大二进制奇数
LeetCode[题解] 2864. 最大二进制奇数
32 0
|
6月前
leetcode:190. 颠倒二进制位
leetcode:190. 颠倒二进制位
31 0
|
6月前
leetcode-1784:检查二进制字符串字段
leetcode-1784:检查二进制字符串字段
32 0
|
6月前
leetcode-67:二进制求和
leetcode-67:二进制求和
40 0