【问题标题】:Smooth out array of increasing numbers平滑增加数字的数组
【发布时间】:2020-02-05 14:56:55
【问题描述】:

我有如下值的数组

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

这里我有一组数字增加的数字,但是当我将其绘制为图形时,这里有两个奇数,800 和 600,两者都应该分别替换为 610 和 900。

我怎样才能实现它。

注意:一排最多有两个奇数,最少10个数字

【问题讨论】:

  • 替换的规则是什么?为什么610900 而不是669972?为什么不直接丢弃它们?
  • 应该是上一个和下一个数字的平均值 (500+700)/2
  • 请注意,即使下一个数字也可以是奇数,因此需要先根据增加的平均值找到一系列数字
  • [100, 300, 10, 20, 30] 的输出应该是什么,最后是奇数? [100, 10, 20, 30, 300] 是什么?也许在您的问题中包含一些场景并解释每种情况可能会很有用。
  • 一排最多有两个奇数,一共10个号码

标签: javascript algorithm numbers


【解决方案1】:

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

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

【讨论】:

  • 嗨,输入应该类似于 395,500,600,700,800,910, 1020
  • 让输入 = [100,2,290,395,10000,100000,700,800,900,1020]; ,这东西弄乱了输入
  • 我有个想法,要找出所有 prev 和 next 之间的差异,,,这里的平均值 100 在许多情况下是最常见的,所以我们必须用它来找到我猜的奇数。跨度>
  • @Graciewilliams,正如我所说,这是一个简单的想法。过滤您认为是 ODD 项目的内容取决于您自己的逻辑。您可以根据自己的标准进行调整。
【解决方案2】:

我假设您想用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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多