题目描述:给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0

题解思路:

  • 把二进制字符串转换成数组这样便于运算
  • 把数组元素进行倒转,最后再把运算结果倒转一下;因为二进制运算是从右到左运算
  • 对两个数组进行循环,把对应位置的数字相加,再定义一个空数组,若相加大于等于2时,则在数组中加入相加结果减去2的值,并在下一次循环时把结果加1;若小于2时则在数组中加入相加的结果
  • 再把数组倒转返回结果就可以了

下面实战开始:

定义函数,参数为需传入的两个字符串a,b

           var addBinary = function (a, b) {}

把字符串转换为数组,并颠倒其顺序

            var arrA = a.split('')arrA.reverse() //顺序倒转var arrB = b.split('')arrB.reverse()

找出两数组较长的数组,目的是为了把其长度切割成与短数组一样的长度,并把切下来的长度最后直接加上就行了

            if (a.length > b.length) {resMax = arrAresMIn = arrB} else {resMax = arrBresMIn = arrA}var len = resMIn.lengthvar resArr = resMax.splice(len) //切割的数组

定义三个变量,分别为储存运算结果的空数组啊arr1、需要往数组中添加的元素sum和判断条件flag,flag的意义是为true时,下次运算结果加1

            var arr1 = [];var sum = 0;var flag = false

对两个数组进行双层for循环,为了使相同位置的元素相加,需要使两层循环的索引数字相同,即把外层索引值等于内层(即内层 j =  外层 i),注意的是内层循环每次只需执行一次,来保证相同位置的元素运算

             for (var i = 0; i < resMax.length; i++) {for (var j = i; j < resMIn.length; j++) {if (resMax[i] * 1 + resMIn[j] * 1 + sum < 2 && flag) {arr1.push(resMax[i] * 1 + resMIn[j] * 1 + sum)sum = 0flag = falsebreak} else if (resMax[i] * 1 + resMIn[j] * 1 + sum >= 2 && flag) {sum = resMax[i] * 1 + resMIn[j] * 1 + sum - 2arr1.push(sum);sum =1flag = true;break} else if (resMax[i] * 1 + resMIn[j] * 1 + sum>= 2) {if (sum > 0) {arr1.push(resMax[i] * 1 + resMIn[j] * 1 + sum - 2);sum = resMax[i] * 1 + resMIn[j] * 1 + sum -2;}else{arr1.push(0);sum  +=1}flag = true;break} else if (resMax[i] * 1 + resMIn[j] * 1 +sum < 2) {arr1.push(resMax[i] * 1 + resMIn[j] * 1 +sum)break}}}

上面代码*1的目的是因为切割的数组中的元素类型都是String的,需要把它转换成Number型的

然后其中判断的条件分别是

  1. 相加结果小于2且flag为true;这时直接往数组arr1中添加运算结果即可,同时把flag变成false,sum变为0,因为下次运算不需要额外加1
  2. 相加结果大于2等于且flag为true;这时运算结果需要-2,flag依旧为true,sum需要加1
  3. 相加结果大于等于2,即flag为false状态,这时若sum=0;sum需要加1,且flag需要变化
  4. 相加结果小于2,把相加结果直接添加到数组中

下面需要做的是把长数组截取下来的部分添加进数组

分析:

其长度小于等于0且flag为true时,只需要在数组中添加元素1即可

其长度大于0且flag为true时,其第一个元素加1之后是否大于等于或小于2;若小于2,只需要第一个元素加1后面的元素直接添加即可; 若大于等于2;还需要进一步for循环判断,若直到最后一个元素时,flag仍为true,则需要额外添加元素1

其长度大于0且flag为false时,直接for循环添加

代码如下:

            if (resArr.length <= 0 && flag) {arr1.push(1)} else if (resArr[0] * 1 + 1 < 2 && flag) {arr1.push(resArr[0] * 1 + 1)for (var m = 1; m < resArr.length; m++) {arr1.push(resArr[m] * 1)}} else if (resArr[0] * 1 + 1 >= 2 && flag) {for (var n = 0; n < resArr.length; n++) {if (resArr[n] * 1 + 1 >= 2 && flag && n == resArr.length - 1) {arr1.push(0)arr1.push(1)break}if (resArr[n] * 1 + 1 >= 2 && flag) {arr1.push(0)} else if (resArr[n] * 1 + 1 < 2 && flag) {arr1.push(resArr[n] * 1 + 1)flag = false} else {arr1.push(resArr[n])}}} else {for (var z = 0; z < resArr.length; z++) {arr1.push(resArr[z] * 1)}}

最后把结果的元素顺序再颠倒一次,类型变成字符串型,再return出去即可完成功能

            var arr2 =  arr1.reverse().join('')return arr2;

全部代码如下:

var addBinary = function (a, b) {var arrA = a.split('')arrA.reverse()var arrB = b.split('')arrB.reverse()if (a.length > b.length) {resMax = arrAresMIn = arrB} else {resMax = arrBresMIn = arrA}var len = resMIn.lengthvar resArr = resMax.splice(len) //切割的数组var arr1 = [];var sum = 0;var flag = falsefor (var i = 0; i < resMax.length; i++) {for (var j = i; j < resMIn.length; j++) {if (resMax[i] * 1 + resMIn[j] * 1 + sum < 2 && flag) {arr1.push(resMax[i] * 1 + resMIn[j] * 1 + sum)sum = 0flag = falsebreak} else if (resMax[i] * 1 + resMIn[j] * 1 + sum >= 2 && flag) {sum = resMax[i] * 1 + resMIn[j] * 1 + sum - 2arr1.push(sum);sum =1flag = true;break} else if (resMax[i] * 1 + resMIn[j] * 1 + sum>= 2) {if (sum > 0) {arr1.push(resMax[i] * 1 + resMIn[j] * 1 + sum - 2);sum = resMax[i] * 1 + resMIn[j] * 1 + sum -2;}else{arr1.push(0);sum  +=1}flag = true;break} else if (resMax[i] * 1 + resMIn[j] * 1 +sum < 2) {arr1.push(resMax[i] * 1 + resMIn[j] * 1 +sum)break}}}if (resArr.length<=0 && flag ) {arr1.push(1)} else if (resArr[0] * 1 + 1 < 2 && flag) {arr1.push(resArr[0] * 1 + 1)for (var m = 1; m < resArr.length; m++) {arr1.push(resArr[m] * 1)}} else if (resArr[0] * 1 + 1 >= 2 && flag) {for (var n = 0; n < resArr.length; n++) {if (resArr[n] * 1 + 1 >= 2 && flag && n == resArr.length-1) {arr1.push(0)arr1.push(1)break}if (resArr[n] * 1 + 1 >= 2 && flag) {arr1.push(0)} else if (resArr[n] * 1 + 1 < 2 && flag) {arr1.push(resArr[n] * 1 + 1)flag = false}else{arr1.push(resArr[n])}}}else{for (var z = 0; z < resArr.length; z++) {arr1.push(resArr[z] * 1)}}var arr2 =  arr1.reverse().join('')return arr2;};var a  ="110010"var b = "10111"var res = addBinary(a, b)console.log(res);

本次文章到这里就结束了,若有错误之处,还望谅解,谢谢!!!

LeetCode题库第67题二进制求和相关推荐

  1. LeetCode题库第867题 转置矩阵

    LeetCode题库第867题 转置矩阵 LeetCode题库第867题 转置矩阵 我首先想到的方法是新建一个二维的矩阵,然后遍历原来的矩阵,将每一个元素放在新矩阵中该放的位置: // javapub ...

  2. LeetCode题库第888题 公平的糖果棒交换

    LeetCode题库第888题 公平的糖果棒交换 LeetCode第888道题 公平的糖果棒交换 首先,题目中说他们两个人的糖果的总数量是不一样的,并且要将A中的一个糖果和B的一个糖果交换后使得他们两 ...

  3. LeetCode题库第1题 两数之和

    两数之和 LeetCode题库第1题 两数之和 看到题,我就想到了暴力法: public int[] force(int[] nums,int target) {for (int i = 0; i & ...

  4. 题解——两种算法解Leetcode题库第977题(暨双指针法小结)

    一.Leetcode题库第977题题目 977. 有序数组的平方 二.解法一--暴力解法 算法思路:for循环遍历数组,对数组元素做平方操作:调用sorted()函数对处理后的数组进行快速排序 算法时 ...

  5. python程序设计题库-python编程题库

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 上期题目连接:1000道python题库系列分享十一(9道)上期题目答案 ...

  6. 2019史上最全java面试题题库大全800题含答案

    2019史上最全java面试题题库大全800题含答案 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中的自动装配有 ...

  7. 2019史上最全java面试题题库大全800题含答案(面试宝典)

    2019史上最全java面试题题库大全800题含答案(面试宝典) 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中 ...

  8. 2022史上最全java面试题题库大全800题含答案

    2022史上最全java面试题题库大全800题含答案 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中的自动装配有 ...

  9. 猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习

    猿人学题库十四题--css加密-雪碧图/数据干扰等 1.  首先 进入 浏览器的开发者工具, 打开就是 俩个无线debugg,正常的操作过掉 1.  找到 debugg 对应的行数,右击选择 neve ...

最新文章

  1. Python+OpenCV实现AI人脸识别身份认证系统(3)—训练人脸识别模型
  2. mysql慢查询优化方案
  3. cocos2d-x之Box2d初试
  4. rdlc报表的制作步骤
  5. 高级版本 【多后台】
  6. 20.经典抽象数据类型
  7. 【物理应用】基于matlab GUI工程供配电系统【含Matlab源码 1051期】
  8. 网络安全实验7 防火墙 Iptables应用
  9. 云服务器上Mongodb被拖库,黑客向我勒索0.015 BTC
  10. 音乐推荐系统协同过滤算法解释
  11. CRM系统之数据库设计
  12. 4.3 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company**
  13. 读美妆论文AN AUTOMATIC FRAMEWORK FOR EXAMPLE-BASED VIRTUAL MAKEUP
  14. ArcGIS中WGS84转为西安80(无自带转换参数的坐标系转换)
  15. 经纬度坐标映射到平面直角坐标系
  16. 成都物韵电子商务有限公司电商代运营公司如何打造爆款?
  17. java 类加载器的理解及加载机制?
  18. 使用Node.js手撸一个建静态Web服务器,内部CV指南
  19. uIP 一个免费的TCP/IP栈
  20. linux 欢迎语,一日一技 | 如何让你的终端欢迎语好看又有趣

热门文章

  1. LASSO坐标下降法Coordinate Descent Method公式推导及代码
  2. 【移动端网页布局】流式布局案例 ④ ( Banner 栏制作 | 固定定位 | 标准流 | 百分比宽度设置 )
  3. 2021-4-8应用
  4. Linux下vmware虚拟机中永久激活Windows7
  5. 排序算法——直接插入法(超详细)
  6. Android 开发学习书籍
  7. 日本游戏公司排名:索尼下滑 任天堂猛跌
  8. 谁帮忙用C#实现下这个加解密函数
  9. SD卡32G实际只有29G是怎么回事?ICMAX来解疑
  10. 申请美国计算机科学,如何申请美国计算机科学专业