需要用右侧元素的最大值替换数组中的元素

3

我需要将数组中的每个元素替换为该数组右侧元素集合中的最大元素。我有以下代码解决方案:

let arr1 = [5,0,5,7,9,4,8];
var temp = [];

for (var i = 1; i < arr1.length + 1; i++)
{
    if (i !== arr1.length)
    {
        temp = [...arr1].slice(i);
        arr1[i-1] = Math.max(...temp);
    }
    else
    {
        arr1[i-1] = arr1[arr1.length - 1];
    } 
}

console.log(arr1);

有没有其他更好的解决方案来解决这个问题?您可以在下一个示例中看到期望的输出:

Input : [5,0,5,7,9,4,8]
Output: [9,9,9,9,8,8,8]

为什么对于 9 的值是 8,而对于 8 的值是 8 - Nina Scholz
对于@NinaScholz的9,右侧的元素集合是[4, 8],因此被它们的最大值8所替换。而对于8(最后一个元素),没有右侧的元素,因此不会被替换。我相信这就是其背后的逻辑,至少这是我理解的。 - Shidersz
2个回答

3
你可以使用 Array.map()。请注意,这种方法不会改变原始数组。

let arr1 = [5,0,5,7,9,4,8];

let res = arr1.map(
    (n, idx, arr) => (idx < arr.length-1) ? Math.max(...arr.slice(idx+1)) : n
);

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

使用O(n)性能的另一种选择是使用Array.reduceRight

let arr1 = [5,0,5,7,9,4,8];
let max = arr1[arr1.length - 1];

let res = arr1.reduceRight(
    (acc, n, idx) => (acc[idx] = max, max = Math.max(n, max), acc),
    []
);

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}


3
您可以通过反向迭代并跟踪最大值,将性能提高到O(n)(因为您当前的实现是O(n^2)):

var arr1 = [5, 0, 5, 7, 9, 4, 8];
var max = arr1[arr1.length - 1];

for (var i = arr1.length - 1; i >= 0; i--) {
  var curr = arr1[i];
  arr1[i] = max;
  if (curr > max) max = curr;
}

console.log(arr1);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接