【问题标题】:AP Computer Science A ArrayListAP 计算机科学 A ArrayList
【发布时间】:2020-04-22 06:50:09
【问题描述】:

问题来了:

给定一个大小未知的整数的 ArrayList 和其他三个 int 值,删除 ArrayList 中位于 int 值指定的索引位置的三个元素。将 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]

【问题讨论】:

  • 直接发布问题,不要指望我们访问一些不知名的网站。并向我们​​展示实际与预期的结果和输入值。
  • 少一个很可能是四舍五入的结果。如果你想平均几个整数,大多数时候结果是一个浮点数,你不能在整数包装器中表示(实际上这相当于一个floor-函数)。尝试使用ArrayList&lt;Float&gt; 作为返回类型(尽管我不明白为什么不直接返回float)。
  • 在获得所有三个项目之前不要删除项目。 int avg = (lst.get(a) + lst.get(b) + lst.get(c))/3; 然后删除 a,b,c

标签: java arraylist


【解决方案1】:

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

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

将平均值计算为双精度然后添加额外的 0.5 使得当双精度转换为 int 时发生的截断也是正确的舍入。如果您不明白为什么,我将提供一些示例,使用 |表示截断(意思是 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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 2014-05-26
    • 2017-07-07
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2013-05-14
    • 2011-03-22
    相关资源
    最近更新 更多