【发布时间】:2020-12-23 09:28:12
【问题描述】:
今天早上我没能解决这个面试问题。
给定一个整数数组,执行一些k操作,每个操作包括删除一个元素并将其除以2和计算ceil 然后用新元素替换该元素。
最后,最小化最终数组的结果
示例:
nums=[10,20,7]
k=4
最终的数组将是:
[5,5,4]
求和结果:
5+5+4=14
场景:
初始数组:[10,20,7]
选择7:[10,20,4]
选择10:[5,20,4]
选择20:[5,10,4]
选择10:[5,5,4]
结果:
5+5+4 = 14
我的代码(未完成的是):
function minSum(num, k) {
return num.map(value => Math.ceil(value / 2)).reduce((value, acc) => acc + value, 0)
}
console.log(minSum([10, 20, 7]))
让我感到困惑的是:
• 我们如何根据操作的数量来选择元素?
编辑:
因为我收到了 2 个关闭请求,让我澄清一下:
假设我们从索引0 到最后一个索引中选择元素,我的代码中缺少什么来满足k 操作?
【问题讨论】:
-
为什么拣货单是7 -> 10 -> 20 -> 10?为什么不从数组的开头开始?如果
k > array.length,在所有元素都被选中一次后会发生什么?为什么在你的情况下index = 1被选中了两次? -
这就是让我超越时间的原因,为什么这个顺序,或者换句话说,选择元素的策略是什么!从
left到right或从right到left或随机? -
对于从 1 到 k 的每次迭代,您能否找到数组中的最大数并将其除以 2 并取 ceil。所以每次迭代你都会找到除以 2 的最大数(我认为这将是减少每次迭代的数组总和的最佳方法)(可能是这样的:jsfiddle.net/cut18Ljd) - 不太确定是否这将始终有效,需要多考虑一下
-
他们只是展示了一种达到最低金额的方法。一旦您有任何 种方法来达到最小总和,您就可以随意更改操作的顺序,并获得相同的结果。例如,他们选择的顺序是索引 2,0,1,1。但他们可以选择 0,1,1,2 或 2,1,0,1 或任何其他顺序。容易找到的顺序是 1,1,0,2 或 1,0,1,2。我会让你弄清楚为什么这些是简单的答案。
-
@NickParsons 这绝对是我解决问题的方法。它之所以有效,是因为如果将除最大值以外的任何值减半,则数组的总和将减少到比您可能拥有的要少的程度。因此,您将减少 20,即 10、10 和 7 之一作为 4 次操作。
标签: javascript arrays algorithm