LeetCode题库第67题二进制求和
题目描述:给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 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型的
然后其中判断的条件分别是
- 相加结果小于2且flag为true;这时直接往数组arr1中添加运算结果即可,同时把flag变成false,sum变为0,因为下次运算不需要额外加1
- 相加结果大于2等于且flag为true;这时运算结果需要-2,flag依旧为true,sum需要加1
- 相加结果大于等于2,即flag为false状态,这时若sum=0;sum需要加1,且flag需要变化
- 相加结果小于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题二进制求和相关推荐
- LeetCode题库第867题 转置矩阵
LeetCode题库第867题 转置矩阵 LeetCode题库第867题 转置矩阵 我首先想到的方法是新建一个二维的矩阵,然后遍历原来的矩阵,将每一个元素放在新矩阵中该放的位置: // javapub ...
- LeetCode题库第888题 公平的糖果棒交换
LeetCode题库第888题 公平的糖果棒交换 LeetCode第888道题 公平的糖果棒交换 首先,题目中说他们两个人的糖果的总数量是不一样的,并且要将A中的一个糖果和B的一个糖果交换后使得他们两 ...
- LeetCode题库第1题 两数之和
两数之和 LeetCode题库第1题 两数之和 看到题,我就想到了暴力法: public int[] force(int[] nums,int target) {for (int i = 0; i & ...
- 题解——两种算法解Leetcode题库第977题(暨双指针法小结)
一.Leetcode题库第977题题目 977. 有序数组的平方 二.解法一--暴力解法 算法思路:for循环遍历数组,对数组元素做平方操作:调用sorted()函数对处理后的数组进行快速排序 算法时 ...
- python程序设计题库-python编程题库
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 上期题目连接:1000道python题库系列分享十一(9道)上期题目答案 ...
- 2019史上最全java面试题题库大全800题含答案
2019史上最全java面试题题库大全800题含答案 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中的自动装配有 ...
- 2019史上最全java面试题题库大全800题含答案(面试宝典)
2019史上最全java面试题题库大全800题含答案(面试宝典) 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中 ...
- 2022史上最全java面试题题库大全800题含答案
2022史上最全java面试题题库大全800题含答案 1. meta标签的作用是什么 2. ReenTrantLock可重入锁(和synchronized的区别)总结 3. Spring中的自动装配有 ...
- 猿人学题库十九题——css加密-雪碧图/数据干扰等——地毯式采坑学习
猿人学题库十四题--css加密-雪碧图/数据干扰等 1. 首先 进入 浏览器的开发者工具, 打开就是 俩个无线debugg,正常的操作过掉 1. 找到 debugg 对应的行数,右击选择 neve ...
最新文章
- Python+OpenCV实现AI人脸识别身份认证系统(3)—训练人脸识别模型
- mysql慢查询优化方案
- cocos2d-x之Box2d初试
- rdlc报表的制作步骤
- 高级版本 【多后台】
- 20.经典抽象数据类型
- 【物理应用】基于matlab GUI工程供配电系统【含Matlab源码 1051期】
- 网络安全实验7 防火墙 Iptables应用
- 云服务器上Mongodb被拖库,黑客向我勒索0.015 BTC
- 音乐推荐系统协同过滤算法解释
- CRM系统之数据库设计
- 4.3 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company**
- 读美妆论文AN AUTOMATIC FRAMEWORK FOR EXAMPLE-BASED VIRTUAL MAKEUP
- ArcGIS中WGS84转为西安80(无自带转换参数的坐标系转换)
- 经纬度坐标映射到平面直角坐标系
- 成都物韵电子商务有限公司电商代运营公司如何打造爆款?
- java 类加载器的理解及加载机制?
- 使用Node.js手撸一个建静态Web服务器,内部CV指南
- uIP 一个免费的TCP/IP栈
- linux 欢迎语,一日一技 | 如何让你的终端欢迎语好看又有趣