我需要用属于该数组右侧元素集的max元素替换array
中的每个元素。我得到了以下代码的解决方案:
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]
答案 0 :(得分: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)
性能的替代方法
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;}
答案 1 :(得分:3)
您可以通过向后迭代并跟踪最大值来将性能提高到 O(n)(因为当前的实现是 O(n ^ 2))。 / p>
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);