https://leetcode.com/problems/surrounded-regions/

我通读了社论,并编写了解决方案。一切都说得通,在本地我的代码将开发板更改为预期的输出,但是当我将代码粘贴到Leetcode时,我的开发板保持不变。我使用了他们的调试器,并在第24行放置了一个断点,果然,我在板上看不到任何变化。

不知道还有什么要问的,所以对不起,如果不合适的话。

以下是我的代码:

import java.util.Arrays;

class Solution {
  private int ROWS;
  private int COLS;

  public void solve(char[][] board) {
    ROWS = board.length;
    COLS = board[0].length;

    // parse left and right borders
    for (int i = 0; i < ROWS; i++) {
      DFS(board, i, 0); // left border
      DFS(board, i, ROWS - 1); // right border
    }

    // parse top and bottom borders
    for (int j = 0; j < COLS; j++) {
      DFS(board, 0, j); // top border
      DFS(board, COLS - 1, j); // bottom border
    }

    // after parsing, we end up with x, o, e board. Pass through it, and change
    // 1) o to x
    // 2) e to o
    for (int i = 0; i < ROWS; i++) {
      for (int j = 0; j < COLS; j++) {
        if (board[i][j] == 'o') {
          board[i][j] = 'x';
        }
        else if (board[i][j] == 'e') {
          board[i][j] = 'o';
        }
      }
    }
  }

  private void DFS(char[][] board, int i, int j) {
    if (i >= ROWS || j >= COLS) return; // bounds
    if (board[i][j] != 'o') return;

    board[i][j] = 'e'; // temporary marker, to help identify border-connected cells
    // go right
    DFS(board, i, j + 1);
    // go down
    DFS(board, i + 1, j);
    // go left
    DFS(board, i, j - 1);
    // go up
    DFS(board, i - 1, j);
  }

  public static void main (String[] args) {
    char[][] test1 = new char[][] {
      {'x','x','x','x'},
      {'x','o','o','x'},
      {'x','x','o','x'},
      {'x','o','x','x'}
    };

    new Solution().solve(test1);
    Arrays.stream(test1).forEach(e -> System.out.println(Arrays.toString(e)));
  }
}


在本地运行,我完全可以在控制台中得到预期的结果

[x,x,x,x]

[x,x,x,x]

[x,x,x,x]

[x,o,x,x]

最佳答案

您的主要问题是您的代码假设一个由小写字母O和X组成的矩阵,而LeetCode问题为您提供了一个由大写字母O和X组成的矩阵。由于'o''O'不同,并且'x'不相同作为'X',您的代码无法解决LeetCode问题。

将来,我建议在复制测试用例时使用复制粘贴功能,以使它们完全正确。



由于我在这里,因此我还将指出您的代码的其他两个问题:


深度优先搜索具有确保您永远不会走出网格底部或右侧边缘的逻辑,但是它并不能确保您永远不会走出网格顶部或左侧边缘。 (您的测试用例不会触发该操作,因为在该测试用例的顶部或左侧没有O。)
您的代码中有许多讨论“解析”的注释,而实际上您并没有这样做。 (请参见https://www.google.com/search?q=parsing。)显然,这不会影响代码的行为,但可能会使人类读者感到困惑,或者至少使您看起来有些笨拙。我建议写(例如)// find all O's connected to left and right borders, and change them to E's

关于java - Leetcode解决方案与本地环境(周围区域)不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59900754/

10-08 20:44