力扣题库之二进制求合
- 对于这道题目,虽然使用字符串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("")
};