力扣题库之二进制求合

力扣题库之二进制求合

  • 对于这道题目,虽然使用字符串API实现较为简单,但当字符串长度超出计算机计算范围时,计算结果会失真。
  • 所以我的思路是 : 取两个字符串较短的那个长度为遍历对打长度(length)。将这一段先相加,考虑0-1相加有4中情况 即 0,1,2,3. index记录下标 0,1时index为0 表示无进位。 2,3时 index为1,表示有进位
  • 在考虑两个字符串长度相等和不等的情况下,多余的那节字符串是否可以直接拼接大到盛放结果的新数组中
// 给你两个二进制字符串,返回它们的和(用二进制表示)。			
			// 输入为 非空 字符串且只包含数字 1 和 0。
			var addBinary = function(str1, str2) {
				//下面这种方法虽然简单,但是如果字符串长度太长,计算机会丢失精度
			   /* str1 = parseInt(str1 , 2)
				str2 = parseInt(str2 , 2)
				var num = str1 + str2
				return num.toString(2) */
				
				//先获取较短的那个字符串的长度
				var length = Math.min(str1.length, str2.length)
				
				//二进制运算,结果只有四种 0,1,2,3(1 + 1 还有进位1)
				//创建一个数组,用来存放二进制数字
				var arr = []
				//记录是否进一
				var index = 0;
				
				//如果长度不一样,那么还要再前面插入未比较的字符串段
				// 比较两个字符串那个是长的
				var reg = str1.length - str2.length
				if(reg > 0){
					var temp = str1
					str1 = str2;
					str2 = temp
				}
				//str2为长字符串
				//遍历字符串,长度为length
				
				for( var i = length - 1 ; i >= 0 ; i--){
					// console.log(i)
					
					var sum = Number(str1[i]) + Number(str2[i + Math.abs(reg)]) + index
					// console.log(sum)
					if(sum === 0){
						index = 0
						arr.unshift(0)
					}					
					if(sum === 1){
						index = 0
						arr.unshift(1)
					}
					if(sum === 2){
						//这时候需要进一
						index = 1
						arr.unshift(0)
					}
					if(sum === 3){
						index = 1
						arr.unshift(1)
					}
					// console.log(Number(str1[i]) , Number(str2[i]) , index ,sum , arr)					
				}
				
				// console.log(arr)
				
				
				//如果第一项,即i = 0,sum 为2或者3时,需要在前面插入1
				if(reg === 0){
					
					var sum_0 = Number(str1[0]) + Number(str2[Math.abs(reg)]) + index
					if(sum_0 === 2){
						arr.unshift(0)
						index = 1
					}
					if(sum_0 === 3){
						arr.unshift(1)
						index = 1
					}
					
				}
				// console.log(str1,str2)
				// console.log(arr)
				//这时,长字符串是str2 ,将str2转为数组并将未比较的那部分拼接在arr前面!
				var newArr = str2.split("").splice(0,str2.length - length)
				// console.log(newArr ,arr)
				//判断index是否为1,这是比较的那一段字符串进位出来的,如果为1,那么未比较的那段字符串还要继续加一
				if(index && reg !== 0){
					// console.log(newArr)
					var index_newarr = 1
					for(var i = newArr.length - 1 ; i >= 0 ; i --){
						var res = Number(newArr[i]) + index_newarr 
						// console.log(i,res , index_newarr)
						if(res === 0){
							arr.unshift(0)
							index_newarr = 0
						}
						if(res === 1){
							arr.unshift(1)
							index_newarr = 0
						}
						if(res === 2){
							arr.unshift(0)
							index_newarr = 1
							
						}
						if(res === 3){
							arr.unshift(1)
							index_newarr = 1
						}
						// console.log(arr)
					}
					
					if((Number(newArr[0]) + index_newarr) >= 2 && newArr.length >= 1){
						
						arr.unshift(1)
					}
					// console.log(arr)
					
				}
				//如果index为0 那么表示没有进位 ,直接拼接没有比较的那一段字符串
				if(!index && reg != 0){
					return newArr.concat(arr).join("")
				}
				// return newArr.concat(arr).join("")
				return arr.join("")
			};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值