wordpress建站必须选择主题,微信支付 企业网站,ui设计风格,东莞浩智网站建设开发前言#xff1a; 又是一年一度的1024#xff0c;那就记录一篇算法博客吧~ 内容如下~ 1 题目介绍
给定两个二进制字符串 a 和 b#xff0c;需要返回它们的和#xff0c;结果以二进制字符串形式给出。
示例 1#xff1a; 输入: a “11”, b “1” 输出: “100”
示例 2… 前言 又是一年一度的1024那就记录一篇算法博客吧~ 内容如下~ 1 题目介绍
给定两个二进制字符串 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 解题思路
2.1 分析思路
一看到这个题目脑子里立刻应该蹦出二进制的运算原理。简单来说二进制加法与十进制有点类似唯一的区别是逢“二”进一而不是逢“十”进一。
我的思路是这样的我们可以模拟两个二进制数相加的过程从最低位也就是最后一位开始一位一位进行加法。如果遇到 1 1 的情况就会产生进位这时我们需要引入一个变量来存储进位信息。
接下来我们逐位相加考虑两个数字以及进位的总和。如果总和大于等于 2那就需要产生进位并将相应的位上的结果保存下来。为了处理不同长度的二进制字符串我的办法是当其中一个字符串已经处理完了另一个还未结束时把结束的字符串当作全零处理继续加法。
等到所有的位都加完之后还要检查是否有进位没有处理。如果有进位就再加上这个进位。
最后由于我们是从最低位开始加的因此需要将结果反转过来转换成字符串输出。
2.2 代码实现
/**
param {string} a
param {string} b
return {string}
*/
var addBinary function(a, b) { let arr_a [], arr_b [], arr_c [], carry 0, k 0, result ; arr_a a.split(); // 将字符串转为字符数组arr_b b.split(); // 同样操作for (let i arr_a.length - 1, j arr_b.length - 1; i 0 || j 0; i--, j--) { let x i 0 ? Number(arr_a[i]) : 0; // 当前 a 位数若 i 小于 0 则取 0let y j 0 ? Number(arr_b[j]) : 0; // 当前 b 位数若 j 小于 0 则取 0let sum x y carry; // 相加的总和arr_c[k] sum % 2; // 将计算结果存储在 arr_c 中carry Math.floor(sum / 2); // 更新进位}if (carry 1) { arr_c[k] 1; // 如果还有进位继续加}arr_c.reverse(); // 翻转数组得到最终结果result arr_c.join(); // 将数组转为字符串输出return result;
};
3 小结
这道题在 LeetCode 上属于简单题型但实际上对于前端开发者来说掌握这种算法已经可以应对不少场景了。尤其是在二进制运算中我们不仅仅巩固了二进制的基础还熟练掌握了 JavaScript 的数组操作方法例如 split、reverse、join 等。
而且刷这种题不仅有助于提升逻辑思维还帮助我发现了许多细节上的优化技巧真正达到了“温故而知新”的效果。在平时的开发工作中遇到复杂逻辑时这些基础算法和思维方式也能够给我们提供很多帮助。 感谢阅读 博主的前端个人网站zhangqiang.hk.cn欢迎加入我的前端学习交流群706947563共同学习进步 彩蛋: 今天收到女朋友的1024礼物一件贴心小棉袄羽绒服开心_