Javascript-как проверить, являются ли 3 числа последовательными и возвращают начальные точки?


Если бы у меня был массив [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);

Спасибо за помощь!

Спасибо за математику.указатель АБС. Вот что я в итоге сделал:

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);
5 4

5 ответов:

Было бы интересно также узнать контекст этой задачи... В любом случае, вот мое решение:

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);
Идея проста: нам не нужно дважды сравнивать двух соседей. ) Достаточно поднять своего рода флаг последовательности, если это сравнение начинает последовательность, и опустить его, если никакой последовательности нет.

Это очень буквальный подход к вашему вопросу - я проверил только передние числа, но добавление обратного будет сделано почти таким же образом

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);

Вам нужно внимательно посмотреть на свое выражение в вашем заявлении if.

В настоящее время он говорит:

  • Если разница между текущим элементом и предыдущим элементом равна не 1, и
  • Если разница между текущим элементом и следующим элементом не 1

Тогда это результат.

Таким образом, на первый взгляд, это неверное логическое утверждение, чтобы определить, находится ли текущий элемент в середине последовательного набор из трех человек.

Кроме того, это также не учитывает восходящий или нисходящий набор из трех.

Попытайтесь понять, в словах, как это состояние будет выглядеть, и идите оттуда.

Некоторые вещи, чтобы рассмотреть

  • я предлагаю вам начать просматривать список с i = 2
  • исследование Math.abs

Я думаю, что это более простой способ сделать это. Сначала проверьте, что среднее значение левого и правого числа равно среднему, а затем проверьте, что абсолютное значение любого соседа равно единице.

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);
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);