题目描述
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例
输入:a = "11", b = "1"
输出:"100"
思路分析
我们可以先将其转化为整数,相加之后再转为二进制,但是这样的处理方式不能过掉全部样例。字符串的长度可能非常长,int类型会超出限制,因此如果使用js时可以考虑转化为bigInt类型的,再进行相加。
另一种方法,也就是遍历字符串的每一项,对进位进行处理,这种方法是比较使用大多数相加类型案例的。
对于相加,我们可以使用位运算符,关于位运算符的使用我们可以参考下图:
参考代码
//方法一:
var addBinary = function(a, b) {
let result = []
let curry = 0
let len = Math.max(a.length,b.length)
a = a.padStart(len,'0')
b = b.padStart(len,'0')
for(let i = len -1; i>= 0; i --) {
let aAt = a.charAt(i)===''?0 :Number(a.charAt(i))
let bAt = b.charAt(i)===''?0:Number(b.charAt(i))
let tmp = aAt + bAt + curry
if(tmp == 3 || tmp == 2) {
curry = 1
tmp == 3 ? result.unshift(1) : result.unshift(0)
}else if(tmp == 1 || tmp == 0) {
curry = 0
tmp == 1 ? result.unshift(1) :result.unshift(0)
}
}
if(curry==1) result.unshift(1)
return result.join('')
};
//方法二:
var addBinary = function(a, b) {
let add = 0
let sum = []
for(let i = a.length -1, j = b.length -1; i >= 0 || j >= 0; i--, j--) {
let num1 = +a[i] || 0
let num2 = +b[j] || 0
sum.unshift(num1 ^ num2 ^ add)
add = num1 + num2 + add > 1 ? 1 : 0
}
if (add === 1) sum.unshift(1)
return sum.join('')
};
//方法三:
function addBinary(a: string, b: string): string {
let add = 0;
let sum = [];
for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {
// 位数不够,默认为 0
let num1 = +a[i] || 0;
let num2 = +b[j] || 0;
// 两数相同异或为0,0与任意数字异或为数字本身
sum.unshift(num1 ^ num2 ^ add);
add = num1 + num2 + add > 1 ? 1 : 0;
}
if (add === 1) sum.unshift(1);
return sum.join('');
};
//方法四:
//转化位bigint类型
var addBinary = function(a, b) {
var a = '0b' + a;
var b = '0b' + b;
var sum = BigInt(a) + BigInt(b);
return sum.toString(2);
};
原文地址:http://www.cnblogs.com/zx529/p/16852064.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性