开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
🍧leetcode刷题之【二进制求和】
1 题目
给你两个二进制字符串 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 个人解析
2.1 思路
看到这题的时候,我们要首先知道二进制的计算原理,二进制整数的话相加是逢二进一。 然后我想到了一个思路,就是让他们每一位商家然后如果遇到1+1,这个时候会产生一个进位,那就得拿一个变量来存储它们的进位,接着他们会进行下一轮的商家这个时候要把他们的敬畏以及A数组和b数组相对应的那两个都要加起来,如果他们还是大于等于二的情况下,那依然要敬畏,就这样一直加,一直加,一直加到末尾。
这个时候总有一个速度现结束,或者另一个速度限速嗯我采取的方法是他们依然是继续参加,如果先结束的那个数组,就始终把那个数组要加的数写成零,让他们一直加,直到两个数组都达到了末尾。全部都结束以后还要判断一下是否有特殊情况就是一直加到末尾以后还有一个进位没有加,那就要判断一下这个进位flag变量是否唯一,如果唯一的话,还要把flag再加一次。
当我们全部加完了以后因为我是顺着加的,所以还需要把这个数组逆序一下,然后转化为字符串,返回这个字符串就是最终的结果了。
下面直接来看一下实现代码吧~
2.2 代码
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
let arr_a=[],arr_b=[],arr_c=[],flag=0,k=0,newStrSum='';
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,y=j>=0?Number(arr_b[j]):0;
if(x+y+flag<=1){
arr_c[k++]=x+y+flag;
flag=0;
}
else{
arr_c[k++]=(x+y+flag)%2;
flag=1;
}
}
if(flag===1){
arr_c[k++]=1
}
arr_c.map((value)=>newStrSum=value+newStrSum)
return newStrSum;
};
3 小结
这个题目在leetCode里面属于简单类型的,但是对于前端来说算法这块掌握简单类型的已经可以应对大部分了,所以目前我就以练习单单类型的入手。然后我发现练习这些算法的时候,对于巩固js的内置对象方法啊大有好处啊,发现了之前用这些方法的时候,会有很多的小细节,然后再做这些题目的时候,可以起到很好的巩固作用。
感谢看完:
- 博主个人前端网站:zhangqiang.hk.cn
- 欢迎加入博主的前端学习qq交流群::706947563,专注前端开发,共同学习进步啊 ~