【问题标题】:How to get the elements with maximum difference in the single array?如何获取单个数组中差异最大的元素?
【发布时间】:2019-10-26 06:07:56
【问题描述】:

假设,a= [3,7, 8,66,121,223,228] 如何获得它们之间差异最大的元素? 我有这个解决方案,但会欣赏比这更好的代码。

let arr = []
a.sort((a,b)=>{
    return arr.push(a-b)
})
let index = arr.indexOf(Math.max(...arr))
a.sort((a,b)=> a-b).slice(index,index+2) 

我希望输出为 [121,223]

【问题讨论】:

  • 为什么是121223
  • 你的意思是两个连续元素之间的差异吗?
  • 这个问题现在是如何措辞的,听起来你想要数组中的 minmax 值,因为它们将是差异最大的元素。

标签: javascript arrays sorting


【解决方案1】:

您可以使用Array.reduce 以简洁的方式解决此问题:

let maxDiff = arr => arr.reduce((acc, c, i, arr) => {	
  if(i && c - arr[i-1] > arr[i-1] - arr[i-2])
    acc = [arr[i-1], c]
  return acc
}, [])

console.log(maxDiff([3,7,8,66,121,223,228]))      // <-- [121,223]
console.log(maxDiff([3,7,8,66,121,223,228,1000])) // <-- [228,1000]

我们的想法是从 first 元素 (i == 1) 开始,然后比较最后一对 arr[i-1] - arr[i-2] 和当前对 (c - arr[i-1]) 之间的差异。如果差异较大,则覆盖累加器直到结束。

您实际上可以通过以下方式进行一行:

let maxDiff = arr => arr.reduce((r,c,i,a) => 
  (r = i && c - a[i-1] > a[i-1] - (a[i-2] || 0) ? [a[i-1], c] : r, r), [])

console.log(maxDiff([3,7,8,66,121,223,228]))      // <-- [121,223]
console.log(maxDiff([3,7,8,66,121,223,228,1000])) // <-- [228,1000]

【讨论】:

  • 竖起大拇指,Akrion
  • 谢谢。很高兴我能提供帮助。
【解决方案2】:

您可以将每一对与最后找到的一对进行检查,并获得具有最大 delta 的一对。

var array = [3, 7, 8, 66, 121, 223, 228],
    result = array.reduce((r, b, i, { [i - 1]: a }) => {
        if (i === 0) return;
        if (i === 1 || b - a > r[1] - r[0]) return [a, b];
        return r;
    }, undefined);

console.log(result);

【讨论】:

  • 太棒了,尼娜。简洁明了。
【解决方案3】:

下面的代码返回 3 个元素

0 - 找到的最大差异

1 - 对的元素 1。

2 - 对的元素 2。

使用reduce 语句迭代并找到该对相当简单。 我没有用随机数组测试过这个。

const array = [3,7, 8,66,121,223,228];

const maxDiff = (arr) => arr.reduce((a, v, i) =>
                              {
                                if(i === arr.length-1) return a;
                                const diff = Math.abs(v-arr[i+1]);
                                return (diff > a[0]) ? [diff, v, arr[i+1]] : a;
                              }, [0]);



console.log(maxDiff(array));

// use a simple destructure to seperate diff and elements
const  [diff, ...elements] = maxDiff(array);
console.log(elements);

【讨论】:

    【解决方案4】:
    a= [3,7, 8,66,121,223,228]
    let MaxIntervalPosition = 0
    
    for(let i=0;i<a.length-2;i++){
        if(Math.abs(a[i]-a[i+1]) > MaxIntervalPosition) {
            MaxIntervalPosition = i
        }
        return [a[i],a[i+1]]
    }
    

    【讨论】:

      【解决方案5】:

      你可以这样做

       var a = [3,7, 8,66,121,223,228]
       var difference = 0;
       var pairIndex = 0;
      
       for(i = 0; i < a.length; i++) {
        var currentItem = a[i];
        var nextItem = a[i+1];
        var currentDifference = Math.abs(currentItem - nextItem);
      
        if(currentDifference > difference) {
          difference = currentDifference;
          pairIndex = i;
        }
       }
      
      var pair = [a[pairIndex], a[pairIndex + 1]];
      return pair;
      

      【讨论】:

      • 很好,沙赫扎德。我认为我们可以使用 array.map() 而不是 for 循环,并且可以用三元运算符替换 if 语句。
      • @VishavKirat07 地图基本上只是建立了一个新的结构并返回。我们真的不需要这里的开销。我们不能使用三元运算符,因为这里没有其他部分。此外,我们在 if 中执行多个语句。不会是最好的情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2019-11-26
      • 2013-05-07
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      相关资源
      最近更新 更多