MetaCareers战舰代码挑战:命中概率计算代码问题排查
战舰代码挑战问题排查
题目描述
你在一个R行C列的网格上玩战舰游戏,网格上有0艘或多艘战舰,每艘占据一个独立单元格。第i行第j列的单元格若含战舰则G[i][j]=1,否则为0。
你将随机射击一个单元格,从R*C个单元格中均匀选择,需计算射击命中战舰的概率。
任务是实现函数getHitProbability(R, C, G)返回该概率,要求返回值的绝对或相对误差不超过10⁻⁶。约束条件
- 1 ≤ R,C ≤ 100
- 0 ≤ G[i][j] ≤ 1
测试用例1
R = 2 C = 3 G = 0 0 1 1 0 1预期返回值 = 0.50000000测试用例2
R = 2 C = 2 G = 1 1 1 1预期返回值 = 1.00000000测试用例说明
第一个用例中,6个单元格里有3个含战舰,命中概率为3/6=0.5;第二个用例所有单元格都含战舰,概率为1.0。
问题与代码分析
你已经明确概率公式为战舰总数 / 网格总单元格数,但代码存在以下关键错误:
- 战舰数统计错误:遍历二维数组时,只检查了每行的第一个元素
i[0],没有遍历每行的所有列,导致统计的战舰数远小于实际数量。 - 总单元格数计算错误:分母用了
G.length(即行数R),但正确的总单元格数应该是R * C。 - 变量重复定义:代码中两次定义了
ans变量,属于语法错误,无法编译通过。 - 精度问题:使用
float类型会导致精度损失,应该用double来保证计算精度。
修正后的代码
public double getHitProbability(int R, int C, int[][] G) { if (R == 0 || C == 0) return 0.0; double ships = 0.0; // 遍历所有单元格统计战舰数 for (int[] row : G) { for (int cell : row) { if (cell == 1) { ships++; } } } double probability = ships / (R * C); return probability; }
额外说明
- 直接返回
double类型即可满足题目对误差的要求,无需额外的四舍五入操作(题目允许绝对或相对误差不超过10⁻⁶,double的精度完全足够)。 - 如果需要输出8位小数的字符串,可以用
String.format("%.8f", probability),但函数返回值建议直接返回double类型,避免格式转换带来的问题。
内容的提问来源于stack exchange,提问作者leftnut
相关产品推荐
相关产品推荐

