我正在处理这个 MetaCareers 代码挑战(需要一个帐户):
您正在具有 𝑅 行和 𝐶 列的单元格网格上玩战舰。网格上有 0 艘或更多艘战舰,每艘都占据一个不同的单元格。从上数第 𝑖第 行和从左数第 𝑗 列中的单元格要么包含战舰 (𝐺𝑖,𝑗=1),要么不包含战舰 (𝐺𝑖,𝑗=0) ).
您将向网格中的随机单元格发射一发子弹。您将从 𝑅*𝐶 个可能的单元格中均匀随机选择该单元格。您感兴趣的是被您的射击击中的单元格包含战舰的概率。
您的任务是实现返回此概率的函数
。getHitProbability(R, C, G)
注意:您的返回值的绝对或相对误差最多为 10─6 才被视为正确。
限制
- 1 ≤ 𝑅,𝐶 ≤ 100
- 0 ≤ 𝐺𝑖,𝑗 ≤ 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。
所以很明显,概率=船舶/网格大小
我将其四舍五入到小数点后第 8 位 - 我似乎无法正确......我的错误是什么? 我的代码尝试:
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);
它只查看给定网格的第一列 - 带有
i[0]
i[1]
、i[2]
、...等处可能有船只它错误地计算了网格中的单元格总数,因为G.length
行的数量,而不考虑列的数量。细胞总数为
G.length * G[0].length
。它尝试重新定义变量ans
return
ans
。它将计算值转换为 String
double
。
它尝试将值四舍五入为 8 位小数,但这不是必需的,因为这只会使答案
ships
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
}
def getHitProbability(R: int, C: int, G: List[List[int]]) -> float:
total = R*C
cells = sum(sum(row) for row in G)
probability = cells/total
return probability
您可以计算战舰的单元格数量,并将其除以网格中的单元格总数。