leetcode 306 累加数(js)
题目描述
累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。
说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
示例
输入: “112358”
输出: true
解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
思路
对字符串进行切割,外层循环得到一个数组,内层循环将数组进行切割,得到第一个,第二个数,和其他数循环判断是否符合条件:
1.rest以前两数之和开头;
2.firstNum,secondNum,rest的0不在十位或十位以上;
如果符合就继续切割restStr,并把使用上一次循环的第二个数代替firstNum,把restStr切割掉的部分代替secondNum,继续循环,直到restStr.length = = = 0为止
用这些条件过滤掉不符合的情况,最后返回true
这里容易忽略一个情况,如果以前切割的arr里restStr本来就是一个空字符串,这种情况下是没有进入过判断是否符合条件的循环的,但是最后会直接返回true,比如测试用例"1023",这个情况就要在while循环前提前判断restStr是否刚开始就是空字符串,防止直接返回true
特殊情况:
对于num.length<=2的,直接返回false;
对于num.lngth===3的,由于不存在0出现在十位或以上,可以直接切割成三个字符串,如果前两者的和不等于第三个,返回false;
题解
/*** @param {string} num* @return {boolean}*/
var isAdditiveNumber = function (num) {let length = num.lengthif (length <= 2) { return false }if (length === 3) {let numArr = num.split("")if (Number(numArr[0]) + Number(numArr[1]) === Number(numArr[2])) {return true}return false}for (let i = 2; i <= length; i++) {let arr = num.slice(0, i)for (let j = 1, len = arr.length; j < len; j++) {let first = arr.slice(0, j)if (first.startsWith("0") && j !== 1) {break;}let second = arr.slice(j)let rest = num.slice(i);if (second.startsWith("0") && second.length !== 1) {continue;}if (rest.startsWith("0") && rest.length !== 1) {continue;}if (isFn(first, second, rest)) {return true;}}}return false
};
/**
* @param {string} restStr
*/
function isFn(first, second, restStr) {let firstNum = parseInt(first);let secondNum = parseInt(second);console.log(first, second, restStr)// 如果分割到底,前面只有俩字符串,最后一个字符串为空,直接返回falseif (restStr === "") {return false}while (restStr.length !== 0) {let sum = firstNum + secondNum + "";if (!restStr.startsWith(sum)) {return false;}restStr = restStr.slice(sum.length);if (restStr.startsWith("0") && restStr.length !== 1) {return false;}firstNum = secondNum;secondNum = parseInt(sum);}return true;
}
性能
leetcode 306 累加数(js)相关推荐
- C# LeetCode刷题 - Leetcode 306. 累加数 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- C#版 - Leetcode 306. 累加数 - 题解
C#版 - Leetcode 306. 累加数 - 题解 306.Additive Number 在线提交: https://www.gaimor.cn 累加数是一个字符串,组成它的数字可以形成累加序 ...
- LeetCode 306. 累加数(暴力回溯)
1. 题目 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0 ...
- Java实现 LeetCode 306 累加数
306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...
- leetcode 29.两数相除
leetcode 29.两数相除 题目描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 ...
- LeetCode 454. 四数相加 II 思考分析
题目 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 为了使问题简单化,所有 ...
- leetcode306. 累加数(回溯)
累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'-'9' ...
- LeetCode 248. 中心对称数 III(DFS/BFS)
文章目录 1. 题目 2. 解题 2.1 DFS 2.2 BFS 1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看). 写一个函数来计算范围在 [low ...
- LeetCode 247. 中心对称数 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看). 找到所有长度为 n 的中心对称数. 示例 : 输入: n = 2 ...
最新文章
- Swift3.0语言教程获取C字符串
- 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
- 邂逅 2008-06-27 23:24
- 觉得UtraWebGrid老不稳定
- 类加载、类加载器、反射
- php打印函数链,如何通过在PHP中使用包含该链的字符串来链接调用函数
- 书还可以这样做?3分钟扒光这本变态级作品 | 文末有福利
- 网站缓存数据实时更新的实现
- IBM发布人工智能显微镜,可检测海洋水资源
- 强大的端到端语音识别框架—RNN-T
- 汽车电子产品EMC测试项目、测试标准
- excel午晚加班考勤统计(excel快速计算午多少个和晚多少个)
- 洋桃开发板笔记(五 ) Flash闪存的使用
- 服务器虚拟化的毕业设计,虚拟化技术毕业论文题目精选
- zabbix 批量生成聚合图形
- 程序员叫啥名字_网友:什么是好程序员?腾讯员工:首先起个“配”自己的网名!...
- Mac 下修改文件的 md5 值
- siamfc-pytorch代码讲解(三):demotrack
- 2018最新版省市区三级联动下拉框+所有源代码以及数据库
- PCIe 5.0 spec学习4.1----PCI-PM(part1)