Сгладить массив растущих чисел - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть массив значений, как показано ниже

[100,190,290,395,500, 800 , 700,800, 600 , 1020]

Здесь у меня есть наборы числа с увеличивающимися числами, но здесь есть два нечетных числа, когда я отображаю их как график, 800 и 600, оба должны быть заменены на что-то вроде 610 и 900 соответственно.

Как мне этого добиться.

Примечание: в строке будет не более двух нечетных чисел, всего минимум 10 чисел

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Я предполагаю, что вы хотите заменить аномалии 800 и 600 на 600 и 910, поскольку они являются средними значениями двух соседних элементов в массиве. Вы можете решить это с помощью одной строки:

const input = [100, 190, 290, 395, 500, 800, 700, 800, 600, 1020];
input.map((val, i, arr) => [0, arr.length-1].includes(i) || (val-arr[i-1])*(val-arr[i+1]) <= 0 ? val : (arr[i-1] + arr[i+1])/2 )
// [ 100, 190, 290, 395, 500, 600, 800, 650, 910, 1020 ]

Краткое объяснение:

[0, arr.length-1].includes(i)

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

(val-arr[i-1])*(val-arr[i+1]) <= 0

проверяет, находится ли число между двумя смежными элементами в массиве.

0 голосов
/ 05 февраля 2020

Простой алгоритм без проверки краевых случаев:

let input = [100,190,290,395,500,800,700,800,600,1020];
let odds = input.filter(( item, index) =>  
   (item > input[index -1] && item > input[index + 1]) || 
   (item < input[index -1] && item < input[index + 1]));
let indices = odds.map( (item) => input.indexOf(item));
console.log(indices);
indices.forEach( i => {
 input[i] = (input[i-1] + input [i+1])/2;
});
//input now is [100, 190, 290, 395, 500, 600, 700, 800, 910, 1020]
console.log(input);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...