AP计算机科学ArrayList

时间:2020-04-22 06:50:09

标签: java arraylist

这是问题:

给出一个大小未知的整数ArrayList和其他三个int值,删除位于int值指定的索引位置的ArrayList的三个元素。将ArrayList的第一个元素设置为三个删除值的平均值(四舍五入到最接近的int),然后返回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; 
}

在大多数情况下,我的解决方案都有效,但在少数情况下,它返回的第一个元素比该情况下的期望值小一个。

这里有一个例子:apcsaListAverageRemovals([33, -481, 245, 359, 166], 3, 2, 2) → Expected:[257, -481] Returned:[256, -481]

1 个答案:

答案 0 :(得分:0)

您计算3个值的平均值的行没有舍入,而是被截断(总是四舍五入)。要解决此问题,请将行更改为:

int avg = (suma + sumb +sumc)/3 + 0.5;

将平均值计算为双精度数,然后再加上0.5,可以使将双精度数转换为int时出现的截断也是适当的舍入。如果您不明白为什么,我将使用|提供一些示例。表示截断(意味着1.5将被截断为1,因此将被写为1 | .5)。

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

希望这会有所帮助!