js 有什么优雅的方式判断一组数组内数字是否连续

2021-10-11 09:28:13 +08:00
 kensoz

比如有一个数组:let arr = [1,2,3,4,5,7]

可见数组中数字不连续,而且没有 6

有没有什么优雅的方式或者奇淫技巧可以判断这个数组不连续并且缺少 6

目前的做法就是先声明一个为 0 的变量然后循环数组,比较的同时变量自增,不知道各位有没有什么好的办法

3228 次点击
所在节点    前端开发
30 条回复
emeab
2021-10-11 09:36:01 +08:00
循环. 连变量都不需要声明.
iMusic
2021-10-11 09:36:57 +08:00
如果只是单纯判断是否连续,可以把最后一项减去第一项,和数组的 length + 1 对比
rrfeng
2021-10-11 09:42:44 +08:00
先快速判断 max - min == len + 1
如果满足然后再遍历。
AoEiuV020
2021-10-11 09:46:17 +08:00
本质上一样,但这里要奇淫技巧就是 reduce 了,

var loss
arr.reduce((prev,cur) => {
console.log("" + prev + ", " + cur)
if (prev == undefined) {
return undefined
}
if(cur - prev == 1) {
return cur
} else {
loss = prev + 1
}

})
console.log(loss)
aureole999
2021-10-11 10:03:12 +08:00
二分查找,如果 index 对应是值是 index+2 的就向左找,是 index+1 的就往右找
mxT52CRuqR6o5
2021-10-11 10:08:34 +08:00
你用啥方法也都是 O(n)级别的
ipwx
2021-10-11 10:12:33 +08:00
你得加附加条件。如果这个数组是有序的,那么 O(1) 查看一下首尾就行。不然就要 O(n) 扫一遍
Yumwey
2021-10-11 10:13:03 +08:00
等差数列
huang119412
2021-10-11 10:13:53 +08:00
@aureole999 @mxT52CRuqR6o5 这应该是 LeetCode 的题目吧,应该有个前提是有序的,这样就可以用二分法查找。
anguiao
2021-10-11 10:18:19 +08:00
只想知道连不连续,那首尾相减判断一下就行了。
如果想知道缺哪个数字的话,可以用二分查找。
iDontEatCookie
2021-10-11 10:32:42 +08:00
let index = arr.findIndex((cur, index, arr) => cur - arr[0] !== index)
if (index !== -1) {
console.log(arr[0] + index)
}
aureole999
2021-10-11 10:36:04 +08:00
@huang119412 他说设个变量是 0 然后边比较边自增,那应该是有序。当然其它条件他也没说,比如是不是只缺一个数字
otakustay
2021-10-11 10:37:04 +08:00
@anguiao 不能吧,[1, 1, 3]首尾相减就是对的,但它不连续
mxT52CRuqR6o5
2021-10-11 10:47:50 +08:00
@huang119412
干脆我们假定这个的数组内数字是连续的,这样我们就不需要检查就能知道这个数组是符合条件的了,这样时间复杂度就为 O(0)
Biwood
2021-10-11 10:53:34 +08:00
const isIncremental = arr => arr.every((item, index, arr) => (index > 0 ? item - arr[index-1] === 1 : true))

isIncremental([1,2,3,4,5,7]) // false
KouShuiYu
2021-10-11 11:01:13 +08:00
应该是最优雅的
[1,2,3].every((ele,index, arr) => (ele - arr[index-1]) === 1 || index === 0)
Biwood
2021-10-11 11:02:48 +08:00
好吧,没看到要找出缺少项,那就扩充一下

const isIncremental = arr => arr.reduce((prev, item, index, arr) => {
if (index === 0) return true;
if (prev !== true) return prev;
return item - arr[index-1] === 1 ? true : arr[index-1] + 1;
}, true)

isIncremental([1,2,3,4])
// true

isIncremental([1,2,3,4,5,7])
// 6
kensoz
2021-10-11 11:16:37 +08:00
@huang119412
@aureole999
@ipwx
不好意思各位,这个数组理论上是有序的,
业务场景可以想象成从数据库某表里取得的 id,id 对应所在行,先确认这一组 id 是否连续,不连续就找到缺失的数字
kensoz
2021-10-11 11:28:01 +08:00
@aureole999
这个数组可能不缺[1,2,3,4,5]
也可能缺 1 个[1,2,3,5]
也可能缺多个[1,2,5]
也可能在多个地方缺[3,5]
chairuosen
2021-10-11 11:49:48 +08:00
return arr.length - 1 === arr[arr.length-1] - arr[0]
O(1) 啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/806938

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX