平滑不断增加的数字阵列



我有如下值数组

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

这里我有一组数字递增的数字,但是当我把它绘制成图时,这里有两个奇数,800 和 600,两者都应该分别替换 610 和 900。

我怎样才能实现它。

注意:连续最多有两个奇数,总共最少10个数字

无需检查边缘情况的简单算法:

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

我假设你想用600910替换800600的异常,因为它们是数组中两个相邻元素的平均值。您可以使用一个衬垫来解决此问题:

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

检查数字是否在数组中的两个相邻元素之间。