4

我有一个可能看起来像这样的数组......

var 数组 = 数组(1,4,7,8,12,15);

数组中的值将始终是整数,并且始终会上升,或者可能与前一个相同,但至少不会变小。

现在我想遍历数组并找出哪个“步骤”之间的差异最大,所以在我的示例中,数组键 4&5 因为从 8-12 == 4 ......但它也可能发生这将是具有相同值的多个步骤,假设我的数组是这个..

var 数组 = 数组(1,5,7,8,12,15);

那么它将是 0&1 和 4&5....

我正在寻找一个可以返回我的函数......哦,它必须是 PureJs......

我希望有一个人可以帮助我。

4

3 回答 3

4

我不确定你到底想要什么。但如果你想要最大的跳跃:

var max=0;
for (i=1; i<array.length; i++)
    max = Math.max(max,array[i]-array[i-1]);

如果您想要发生最大跳跃的第一个位置:

var max=0;
var firstLoc=0;
for (i=1; i<array.length; i++)
{
    curJump = array[i]-array[i-1];
    if (curJump > max) 
    {
        firstLoc = i;
        max = curJump;
    }
}

如果您想要此跳转发生的最后一个位置:

var max=0;
var lastLoc=0;
for (i=1; i<array.length; i++)
{
    curJump = array[i]-array[i-1];
    if (curJump >= max) 
    {
        lastLoc = i;
        max = curJump;
    }
}

如果您想要发生此最大跳跃的所有位置的数组:

var max=0;
var locs = [];
for (i=1; i<array.length; i++)
{
    curJump = array[i]-array[i-1];
    if (curJump == max)
    {
        locs.push(i);
    } else if (curJump > max)
    {
        locs = [i];
        max = curJump;
    }
}
于 2013-06-18T15:13:53.540 回答
2

函数式方法利用简单的纯函数和内置函数来完成一些繁重的工作:

var array = Array(1,5,7,8,12,15);

//get differences:
var diffs=array.map(function(a,b,c){
 return a - (c[b-1]||0);
},{});

//find max diff and collect elements:
var rez=diffs.map(function(a,b){return a==this && [b-1, b]; }, 
                   Math.max.apply(0, diffs)
            ).filter(Boolean);

//display the findings:
alert(rez.join("|")) //shows: 0,1|3,4

当我完成并且我没有看到任何本地变量或条件被使用时,我总是感到惊讶......

于 2013-06-18T15:28:49.897 回答
1

蛮力解决方案是依次遍历数组并查看从 a[i] 到 [i+1] 的差异。如果大于最大值,则将最大值设置为此值。

由于数组已排序,因此也可以进行二分搜索。

于 2013-06-18T14:58:38.943 回答