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

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

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

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

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

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

3235 次点击
所在节点    前端开发
30 条回复
aureole999
2021-10-11 12:38:55 +08:00
@kensoz 无重复的话可以先判断首尾相减+1 是否等于长度,等于的话就说明从数组开始的地方不缺,再判断一下第一个是不是 1,就不用往下走了。差 1 的话只缺一个,二分解决。差 2 以上的话数组再分一半,左右之间挨着的两个判断一下,然后左右递归,分别判断。速度最好 O(logn),最差 O(n)。边界需要处理好。
aureole999
2021-10-11 13:11:32 +08:00
递归
var a = [3,5,6,7,9,10,22];
var res = [];
if (a[0] > 1) {
res = Array.from({length: a[0]-1}, (_, i) => i + 1);
}
res.push(...find(a, 0, a.length-1));


function find(arr, start, end) {

if (arr[end] - arr[start] == end - start) {
return [];
}
if (start >= end) return [];

var mid = Math.floor((end + start) / 2);
var res = [];

res.push(...find(arr, start, mid));
if (arr[mid] + 1 != arr[mid+1]) {
var max = arr[mid+1] - 1;
var min = arr[mid] + 1;
res.push(...Array.from({length: max-min+1}, (_, i) => i + min));
}
res.push(...find(arr, mid + 1, end));
return res;
}

console.log(res);
icedwatermelon
2021-10-11 13:38:25 +08:00
[...Array(arr[arr.length-1])].map((v, i) => (i+1)).filter((v,i)=>(!arr.includes(v)))
wanguorui123
2021-10-11 14:16:05 +08:00
[1,2,3,4,5,6].sort().every((v,i,arr)=>i>0?arr[i-1]+1==v:true)
mxT52CRuqR6o5
2021-10-11 14:16:24 +08:00
@kensoz 能保证从 1 开始吗?如果不能的话,如果缺的是两边的话是判断不出来的
wanguorui123
2021-10-11 14:17:52 +08:00
@wanguorui123 [1,2,3,4,5,6].every((v,i,arr)=>i>0?arr[i-1]+1==v:true)
mxT52CRuqR6o5
2021-10-11 14:32:50 +08:00
@kensoz
开头的数字不能确定,则无法判断出头部数字的缺失,尾部的数字如果不能确定,则无法判断出尾部数字的缺失
kensoz
2021-10-11 15:08:28 +08:00
@mxT52CRuqR6o5
用场景来举例就是一个表,记录一个东西并用 id 编号。
增加了 1,2,3id 后,删除了 2id,查询得目前剩下 1,3id,如果再有新增就用 2 来编号(最小的缺失数)
但是这个删除行为是随机的,不可控,所以理论上任何位数都有可能被删除
不过可以保证的是这一定是一个有序数组

ps:如果是后端直接用 sql 查询空位即可,但是数据交给前端处理的话,就相对麻烦了一下
mxT52CRuqR6o5
2021-10-11 15:27:30 +08:00
@kensoz
那我第一要考虑的就是“最小的缺失数”这个需求到底合不合理,最优先考虑是去否掉这个需求
lrvinye
2021-10-12 00:40:53 +08:00
@iMusic 中间的不管了? 随手举个例子 [1,6,4,9,5]

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

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

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

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

© 2021 V2EX