java Facebook的热身挑战,我似乎无法弄清楚-战舰

w7t8yxp5  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(90)

我正在使用this MetaCareers code challenge(需要一个帐户):
你在一个由行和列组成的网格上玩战舰游戏。网格上有0个或多个战舰,每个战舰占据一个单独的单元格。𝑅从上数第行、从左数第列的单元格包含战舰(,= 1)或不包含战舰(,= 0)。𝐶 columns. There are 0 or more battleships on the grid, each occupying a single distinct cell. The cell in the 𝑖th row from the top and 𝑗th column from the left either contains a battleship (𝐺𝑖,𝑗 =1) or doesn't (𝐺𝑖,𝑗 =0).
你要向网格中的任意一个单元开一枪。你将从 * 个可能的单元格中均匀随机地选择这个单元格。𝑅你感兴趣的是被你击中的细胞包含一艘战舰的概率。𝐶 possible cells. You're interested in the probability that the cell hit by your shot contains a battleship.
您的任务是实现返回此概率的函数getHitProbability(R, C, G)

  • 注意:您的返回值必须有一个绝对或相对误差最多 * 10 ─ 6 * 被认为是正确的。*

约束

  • 1 ≤,≤ 100𝑅,𝐶 ≤ 100
  • 0 ≤,≤ 1𝐺𝑖,𝑗 ≤ 1

示例测试用例#1

R = 2
C = 3
G = 0 0 1
    1 0 1
Expected Return Value = 0.50000000

示例测试用例#2

R = 2
C = 2
G = 1 1
    1 1
Expected Return Value = 1.00000000

示例说明

在第一种情况下,网格中的6个单元中有3个包含战列舰。因此,你的射击击中其中一个的概率是3/6 = 0.5。
在第二种情况下,所有4个单元包含战列舰,导致命中战列舰的概率为1.0。
所以很明显概率=船/网格大小
我把它四舍五入到小数点后第八位--我似乎不能得到正确的。我错在哪里?
我的代码尝试:

if (G.length == 0) return 0;
double ships = 0.00000000;
for (int[] i : G) {
    if (i[0] == 1) ships++;
}
float ans = Math.round((ships / (float) G.length) * 100000000) / 100000000.0f;
System.out.println(String.valueOf(ans));
String ans = String.format("%.8f", (ships / G.length));
// System.out.println(ans);
// BigDecimal bd1 = new BigDecimal(ships/G.length);
// System.out.println(bd1);
k97glaaz

k97glaaz1#

以下是代码尝试中的问题:

  • 它只查看给定网格的第一列--i[0]--而不考虑i[1]i[2]等处可能有船。
  • 它错误地计算了网格中的单元格总数,因为G.length表示 * 行 * 的数量,而没有考虑 * 列 * 的数量。单元格总数为G.length * G[0].length
  • 它试图重新定义变量ans,这将不允许代码编译。
  • 在定义了ans之后,它不会执行return
  • 它将计算值转换为String,而函数的返回类型为double

不是真实的的问题,但是:

  • 它试图将一个值四舍五入到8位十进制数字,但这不是必要的,因为这只会使答案 * 不那么 * 准确。
  • 它处理网格为空的情况,但这种情况永远不会发生,因为𝑅和𝐶保证至少为1。
  • 不需要测试单元格的值,您可以将单元格的值添加到ships的值,因为单元格的值保证为0或1,并且添加0使ships的值保持不变。

下面是作为剧透的代码的更正:
public double getHitProbability(int R, int C, int[][] G) { double ships = 0; for (int[] row : G) { for (int val : row) { // Visit each cell in the row ships += val; // Add the cell's value unconditionally } } return ships / (G.length * G[0].length); // The total number of cells is R*C }

相关问题