javascript - Javascript:在数组中查找连续数字时保持关闭
问题描述
我正在做一些编码练习,并在网上发现了一些问题。
在寻找返回数组中连续数字的数量时,我不断得到比预期低 1 个整数。
function LongestConsecutive(arr) {
arr.sort((a,b) => {return a-b});
let highest = 0;
let counter = 0;
let prevNum;
arr.forEach((num,index,arr) => {
if (prevNum === undefined) {
prevNum = num
} else {
if (num + 1 == arr[index + 1]) {
counter += 1;
highest = Math.max(highest,counter)
} else {
counter = 0;
}
}
})
return highest;
}
例如,输入 [5, 6, 1, 2, 8, 9, 7] 应该返回 5——因为在排序时,有 5 个连续的数字。我一直比我应该得到的低一个,所以对于这个例子,我得到 4。得到正确答案的唯一方法是当我返回“最高 + 1”时,这显然是在避免这个问题。
解决方案
第一次迭代将命中
if (prevNum === undefined) {
prevNum = num;
}
但这不是第一个连续的数字吗?所以应该在这里counter = 1;
。highest = 1;
接下来,您counter = 0;
在一个else
案例中重置。为什么?至少有一个数字是连续的,因此请将其重置为1
。
然后,您并没有真正prevNum
用于任何事情。if (prevNum === undefined)
可以替换为if (index === 1)
。
然后检查当前数字 ( num
) 是否在下一个数字 ( ) 之前arr[index + 1]
,但跳过对第一个索引的检查。如何检查当前号码是否成功?
此代码使用上述更改以及一些代码质量更改:
function longestConsecutive(arr) { // Non-constructor functions start with a lower-case letter
arr.sort((a, b) => a - b); // Use expression form
let highest = 0;
let counter = 0;
arr.forEach((num, index, arr) => {
if (index === 0) {
highest = 1;
counter = 1;
} else if (num - 1 === arr[index - 1]) { // Merge `else if`, use strict equal
counter += 1;
highest = Math.max(highest, counter);
} else {
counter = 1;
}
});
return highest;
}
推荐阅读
- android - 从 BottomSheetDialogFragment 打开片段 - Android Studio Java
- android - 当我向用户发送图像时,Firebase 数据库没有显示任何内容。reference.child("聊天").push().setValue(hashMap);
- c# - AWS Lambda 上的 .net core .XLSX 流式传输
- node.js - 数据库“neo4j”不可用。无法重置 neo4j 数据库
- javascript - 如何在此场景中触发 keyup 事件
- c# - 如何将字符串转换为 Microsoft.WindowsAzure.Storage.Table.ITableEntity?
- cmake - cmake configure_package_config_file 未正确添加 PATH_VARS
- java - 当我将 SpringBoot 应用程序部署到 AWS Elastic Beanstalk 并且无法从本地 SpringBoot 连接到 RDS 时出现 502 bad gateway
- c# - 是否有一种通用方法可以在现有列表上创建“视图”,允许仅在调用提交方法后才进行更改?
- c++ - 为什么我无法在下面的代码中为浮点变量添加值?