You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

问题与代码分析

你已经明确概率公式为战舰总数 / 网格总单元格数,但代码存在以下关键错误:

  1. 战舰数统计错误:遍历二维数组时,只检查了每行的第一个元素i[0],没有遍历每行的所有列,导致统计的战舰数远小于实际数量。
  2. 总单元格数计算错误:分母用了G.length(即行数R),但正确的总单元格数应该是R * C。
  3. 变量重复定义:代码中两次定义了ans变量,属于语法错误,无法编译通过。
  4. 精度问题:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:07:20