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