一天一大 leet(二进制求和)难度:简单 DAY-23
时间:2022-07-25
本文章向大家介绍一天一大 leet(二进制求和)难度:简单 DAY-23,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目(难度:简单):
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例
- 示例 1
输入: a = "11", b = "1"
输出: "100"
- 示例 2
输入: a = "1010", b = "1011"
输出: "10101"
提示
- 每个字符串仅由字符 '0' 或 '1' 组成。
- 1 <= a.length, b.length <= 10^4
- 字符串如果不是 "0" ,就都不含前导零。
抛砖引玉
先把 a、b 转换成字符串方便逐位相加 再把 a、b 中较短的字符用 0 补齐 middleValue 表示进位值 逐位、低位到高位(倒序)相加(a、b、进位)
- 0 结果最前追加 0,不进位
- 1 结果最前追加 1,不进位
- 2 结果最前追加 0,进位
- 3 结果最前追加 1,进位
最后,如果前一位有进位则结果最前面,不然直接返回
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function (a, b) {
let aLen = String(a).length,
bLen = String(b).length,
middleValue = 0,
_result = ''
;(a = String(a)), (b = String(b))
if (aLen > bLen) {
len = aLen
for (let i = 0; i < aLen - bLen; i++) {
b = '0' + b
}
} else {
len = bLen
for (let i = 0; i < bLen - aLen; i++) {
a = '0' + a
}
}
for (let i = len - 1; i >= 0; i--) {
switch ((Number(a[i]) || 0) + (Number(b[i]) || 0) + middleValue) {
case 3:
middleValue = 1
_result = '1' + _result
break
case 2:
middleValue = 1
_result = '0' + _result
break
case 1:
_result = '1' + _result
middleValue = 0
break
case 0:
_result = '0' + _result
middleValue = 0
break
}
}
return Number(middleValue) ? middleValue + _result : _result
}
其他解法
- 当前位不带进位相加的结果是异或求出的
- 当前位 AND 得出当前位的进位,考虑上之前的进位,算出给下一轮迭代的进位
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function (a, b) {
while (a.length > b.length) b = '0' + b
while (a.length < b.length) a = '0' + a
let res = new Array(a.length)
let val // 当前位不进位的相加结果
let carry // 当前位的进位
let carryFromBefore = 0 // 当前相加是否有来自上一位的进1
for (let i = a.length - 1; i >= 0; i--) {
val = Number(a[i]) ^ Number(b[i]) // 异或是不带进位的相加
carry = Number(a[i]) & Number(b[i]) // 求出当前位的进位
if (carryFromBefore) {
// 有来自上一位的进位
if (val == 0) {
val = 1 // 加上进位 变为1
} else {
// 当前位1 + 进位1 = 2
carry = 1 // 往前进1
val = 0 // 当前位为0
}
}
carryFromBefore = carry // 给下一轮迭代使用的进位
res.unshift(val) // 从res数组的前头推入
}
if (carry) res.unshift(1) // 循环结束,还有进位,就要多加1
return res.join('')
}
- 先对两个字符串按照最长长度,在前面用'0'补全长度
- 然后对字符串从后向前遍历,对两个字符串相同位置的字符进行求和
- 如果和 >=2,说明发生了进位,保存进位状态为 true,下一次求和要 + 1
- 如果和 < 2,说明没有发生进位,保存进位状态为 false,下一次求和要 + 0
- 遍历结束后,如果进位状态为 true, 说明第一位字符串仍然发生了进位,则拼上一个 1
var addBinary = function (a, b) {
let maxLen = Math.max(a.length, b.length)
a = a.padStart(maxLen, '0')
b = b.padStart(maxLen, '0')
let result = Array.from({ length: maxLen }, (x) => 0)
let hasCarry = false
for (let i = maxLen - 1; i >= 0; i--) {
let tempa = a[i] || 0,
tempb = b[i] || 0
result[i] = +tempa + +tempb + (hasCarry ? 1 : 0)
hasCarry = result[i] >= 2
result[i] %= 2
}
result = (hasCarry ? '1' : '') + result.join('')
return result
}
- 电工学PLC编程的入门建议
- 人工智能、区块链、图灵测试……这30个大数据热词你真的都懂吗?
- Enterprise Library 4.1学习笔记4----缓存应用程序块
- 设置py文件的路径
- jenkins中通过git发版操作记录
- Enterprise Library 4.1学习笔记3----安全应用程序块
- mysql密码遗忘和登陆报错问题
- 新一轮发展趋势:城市智能化已经势不可挡
- Enterprise Library 4.1学习笔记2----数据访问程序块
- 微信小程序中用户唯一ID的获取
- Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录
- Enterprise Library 4.1学习笔记1----配置应用程序块(c/s和b/s均适用)
- 简单账本-用完即走的微信小程序
- 新技术革命和新产业变革正进行 “互联网+大数据+人工智能+”时代正到来
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 明明有class为什么还是报ClassNotFoundException?
- Maven 错误找不到符号
- 环境变量配置为jdk8,却显示java版本为jdk7
- Python脚本按照当前日期创建多级目录
- linux常用的读取文件内容指令
- Executors.newSingleThreadScheduledExecutor();线程池中放入多个线程问题
- SqlServer批量删除表
- java 获取一天内crontab任务执行的时间点
- Python自学成才之路 魔术方法之一元,二元运算符
- Python自学成才之路 魔术方法之打印对象实例
- Python自学成才之路 装饰器必用的wraps注解
- Python自学成才之路 使用函数作为装饰器
- Python自学成才之路 装饰器编程之初试装饰器
- Python自学成才之路 元类中的__new__和__init__方法
- Centreon+Nagios实战第七篇——安装NRPE