我有如下值数组
[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);
我假设你想用600
和910
替换800
和600
的异常,因为它们是数组中两个相邻元素的平均值。您可以使用一个衬垫来解决此问题:
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
检查数字是否在数组中的两个相邻元素之间。