我正在使用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);
1条答案
按热度按时间k97glaaz1#
以下是代码尝试中的问题:
i[0]
--而不考虑i[1]
、i[2]
等处可能有船。G.length
表示 * 行 * 的数量,而没有考虑 * 列 * 的数量。单元格总数为G.length * G[0].length
。ans
,这将不允许代码编译。ans
之后,它不会执行return
。String
,而函数的返回类型为double
。不是真实的的问题,但是:
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 }