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

问题描述 投票:0回答:2

我正在处理这个 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);


java algorithm probability bigdecimal
2个回答
1
投票

它只查看给定网格的第一列 - 带有
    i[0]
  • - 不考虑在
    i[1]
    i[2]
    、...等处可能有船只
    它错误地计算了网格中的单元格总数,因为
  • G.length
  • 代表
    的数量,而不考虑的数量。细胞总数为G.length * G[0].length
    它尝试重新定义变量
  • ans
  • ,这将不允许代码编译。
    定义 
  • return
  • 后不会执行
    ans
    它将计算值转换为 
  • 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 }


    


0
投票

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

您可以计算战舰的单元格数量,并将其除以网格中的单元格总数。

© www.soinside.com 2019 - 2024. All rights reserved.