Javascript 快速检查数字的方法是在一组数字的范围内

Javascript 快速检查数字的方法是在一组数字的范围内,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我只是遇到了一个如下的场景。这听起来有点像一个leetcode问题 支持我可以得到一个模式中的数字列表,以简化我的问题 例如,[0,5,10,15,20,25]或[0,7,14,21],它已被排序 然后给定一个范围(我可以保证两个连续数字之间的范围不会重叠) 例如,range=2 如果num=11,那么我支持获取10的索引,因为11在10-2到10+2的范围内 如果num=12.5,那么我将返回-1或任何其他表示我们没有找到的内容 我可以简单地浏览列表,检查数字是否在每个数字的范围内,但我觉得有

我只是遇到了一个如下的场景。这听起来有点像一个leetcode问题

支持我可以得到一个模式中的数字列表,以简化我的问题

例如,
[0,5,10,15,20,25]
[0,7,14,21]
,它已被排序

然后给定一个
范围
(我可以保证两个连续数字之间的范围不会重叠)

例如,
range=2

如果
num=11
,那么我支持获取10的
索引,因为
11
10-2
10+2
的范围内

如果
num=12.5
,那么我将返回
-1
或任何其他表示我们没有找到的内容

我可以简单地浏览列表,检查数字是否在每个数字的范围内,但我觉得有一个O(1)解决方案,因为列表本身有一些模式存在。非常感谢您的帮助

还提供了
Diff
,上面的示例为
Diff=5

我现在在O(N)列表检查中没有遇到任何性能问题,只是想让事情变得更好。

您可以使用检查数字(和范围)是否与列表重叠,例如:

这将是O(n),我怀疑您确实需要一个非常大的列表来证明创建O(1)类型解决方案的合理性

我们可以采用另一种方法,创建一个候选数字数组(范围内的数字,例如,对于10+-2,这将是[8,9,10,11,12])。注意:这种方法不适用于浮点值

我们检查从列表中创建的集合的每个成员数。从技术上讲,这仍然是O(n),但n很可能很小(例如5)

let list=[0,5,10,15,20,25];
//此解决方案最多需要N次迭代,其中N是列表的长度
函数checkInRange(值、范围、列表){
返回列表。一些((el)=>{
返回(el>=(值-范围))&(el值-范围+k);
let set=新集合(列表);
返回a.some((el)=>{
返回集has(el);
})
}
log(“具有简单循环的解决方案”);
日志(checkInRange(11,1,list));
日志(checkInRange(10,0,list));
日志(checkInRange(30,5,list));
日志(checkInRange(9,0,list));
日志(checkInRange(100,20,list));
console.log(“带集合的解决方案”);
日志(checkInRangeSet(11,1,list));
log(checkInRangeSet(10,0,list));
日志(checkInRangeSet(30,5,list));
log(checkInRangeSet(9,0,list));
log(checkInRangeSet(100,20,list));
这是我对O(1)解决方案的一个尝试

const list=[0,7,14,21,28];
常数间隔=列表[1];
常数范围=2;
函数getIndex(num,range){
常数halfItvl=间隔/2;
const inRange=Math.abs((num%间隔)-halfItvl)>=halfItvl-range;
返回范围?数学特鲁克((num+halfItvl)/区间):-1;
}
//测试列表中的所有数字
对于(变量i=0;i}
不够清楚…为什么13不好?它离15还有2,所以索引15?你有更多的例子和你的尝试吗?@iAmOren,很抱歉误导你,我应该说12.5。它不需要是整数,我现在会更正它。当列表确实有模式时,确定该模式的唯一方法是查看列表中的所有值。或者您知道列表从0开始,增量为5吗?在这种情况下,有一个O(1)解决方案。@fubar是的,我可以让它以相同的增量/diff从0开始,我最终得出了一个想法,它与您的非常接近。
rements=num%interval
然后检查
rements=interval
以确定它是否属于类别。@Yunhai:很好,那么您是否使用这些比较来确定是否应该返回较低的值索引与较高的索引?准确地说,
Math.floor(num/interval)
获得
商/较低的索引
,那么结果要么是
商+1(较高的索引)
或者
-1(超出范围)