7

如果我有一个数组[1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7]并且想要找到 3 个连续数字的每个案例(无论是升序还是降序),我该怎么做?

第二部分是用这些序列中的每一个的索引来提醒一个数组。

例如。前一个数组将返回[0,4,6,7].

到目前为止,我有这个......这是一个艰难的开始

var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 1; i < arr.length; i++) {
    if ((arr[i] - arr[i-1] != 1) && (arr[i] - arr[i+1] != 1)) {
        results.push(arr[i]);
    }

}
alert(results);

谢谢您的帮助!

感谢 math.abs 指针。这就是我最终做的事情:

var array = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var indexes = [];

for(var i=0; i < array.length; i++) {
    var diff = array[i+1] - array[i];
    if(Math.abs(diff)==1 && array[i+1]+diff == array[i+2]) {
        indexes.push(i);
    }
}
alert(indexes);
4

5 回答 5

4

知道这个任务的上下文也会很有趣......无论如何,这是我的解决方案:

var arr     = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];
var limit   = arr.length - 1; 

var sequence = 0;
for (var i = 0; i < limit; ++i) {
  var diff = arr[i+1] - arr[i];
  if (sequence && sequence === diff) {
    results.push(i-1);
    continue;
  }
  sequence = (diff === 1 || diff === -1) // or ... Math.abs(diff) === 1
           ? diff
           : 0;
}
console.log(results);

这个想法很简单:我们不需要两次比较两个邻居。) 如果此比较开始一个序列,则升高一种序列标志就足够了,如果没有序列则降低它。

于 2012-05-24T20:36:57.567 回答
3

这是对您的问题的一种非常直接的方法-我只检查了转发数字,但是添加反向几乎可以以相同的方式完成

var arr = [1, 2, 3, 4, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 0; i < arr.length; i++) {

    // if next element is one more, and one after is two more
    if (arr[i+1] == arr[i]+1 && arr[i+2] == arr[i]+2){

        // store the index of matches
        results.push(i);

        // loop through next numbers, to prevent repeating longer sequences
        while(arr[i]+1 == arr[i+1])
            i++;
    }

}
console.log(results);
于 2012-05-24T20:24:34.957 回答
2

您需要仔细查看 if 语句中的表达式。

它目前说:

  • 如果当前元素与前一个元素的差为1,并且
  • 如果当前元素和下一个元素的差不是1

那么这是一个结果。

所以,从表面上看,这是一个不正确的逻辑语句来确定当前元素是否在三个连续集合的中间。

此外,这也不考虑上升或下降的三个集合。

试着用语言弄清楚情况会是什么样子,然后从那里开始。

一些需要考虑的事情

  • 我建议你从i = 2
  • 研究Math.abs
于 2012-05-24T20:22:06.637 回答
1

这是我认为更简单的方法。首先检查左右数的平均值是否等于中间,然后检查任一邻居的绝对值是否为1。

var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var indexes = [];

for(var i=1; i < arr.length; i++) {
    if((arr[i-1]+arr[i+1]) / 2 == arr[i] && Math.abs(arr[i]-arr[i-1]) == 1) {
        indexes.push(i-1);
    }
}
alert(indexes);
于 2012-05-24T21:18:29.800 回答
0
var arr = [1, 2, 3, 5, 10, 9, 8, 9, 10, 11, 7];
var results = [];

for (var i = 0; i < arr.length - 2; i++) {
    if ((arr[i+1] - arr[i] === 1) && (arr[i+2] - arr[i+1] === 1)) {
        results.push({
            i:i,
            mode:'up',
            arr:[arr[i],arr[i+1],arr[i+2]
        });
    }
    if ((arr[i+1] - arr[i] === -1) && (arr[i+2] - arr[i+1] === -1)) {
        results.push({
            i:i,
            mode:'down',
            arr:[arr[i],arr[i+1],arr[i+2]
        });
    }

}
alert(results);
于 2012-05-24T20:23:09.490 回答