下面是问题:
给定未知大小的整数的ArrayList和其他三个int值,删除位于int值指定的索引位置的ArrayList的三个元素。将ArrayList的第一个元素设置为删除的三个值的平均值(四舍五入为最接近的整数),并返回ArrayList。
前提条件: ArrayList将至少包含四个元素,其他int值将按降序排列,以防止混淆它们所代表的索引。
apcsaListAverageRemovals([3, 6, 8, 10], 3, 2, 1) → [8]
apcsaListAverageRemovals([-177, 383, 476, -15, 62, 19, -247], 3, 2, 1) → [281, 62, 19, -247]
apcsaListAverageRemovals([258, 99, 225, 430, -497, 124], 4, 3, 3) → [19, 99, 225]这是我尝试过的解决方案
public ArrayList<Integer> apcsaListAverageRemovals(ArrayList<Integer> lst, int a, int b, int c) {
int suma = lst.get(a);
lst.remove(a);
int sumb = lst.get(b);
lst.remove(b);
int sumc = lst.get(c);
lst.remove(c);
int avg = (suma + sumb +sumc)/3;
lst.set(0, avg);
return lst;
}在大多数情况下,我的解决方案都是有效的,但在少数情况下,它返回的第一个元素比该情况下的期望值小1。
这里有一个例子:apcsaListAverageRemovals([33, -481, 245, 359, 166], 3, 2, 2) → Expected:[257, -481] Returned:[256, -481]
发布于 2020-05-01 05:35:20
计算3个值的平均值的行不会舍入,它会截断(总是向下舍入)。要解决此问题,请将该行更改为:
int avg = (suma + sumb +sumc)/3 + 0.5;将平均值计算为双精度,然后添加额外的0.5,因此当双精度转换为整型时发生的截断也是适当的舍入。如果您不明白原因,我将提供几个示例,使用|来表示截断(这意味着1.5将被写为1|.5,因为它被截断为1)。
2.3 should round to 2 -> 2.3 + 0.5 = 2|.8
2.7 should round to 3 -> 2.7 + 0.5 = 3|.2
3.5 should round to 4 -> 3.5 + 0.5 = 3|.0
3.4999 should round to 3 -> 3.499 + 0.5 = 3|.999在您的问题中包含的示例中:
The average of 359, 245, and 166 should round to 257.
(359 + 245 + 166)/3.0 = 256.66666667
256.66666667 + 0.5 = 257|.16666667希望这能有所帮助!
https://stackoverflow.com/questions/61358906
复制相似问题