以 Char[] 为单位筛选句点



Leetcode 上的有效数独问题已解决,但是,关于"."仍然存在一个小问题,直到我尝试另一种方式,我无法过滤。

查看有关(1)

和(2),(1)=使用继续过滤句点的正确方法的注释部分;如果找到'.。(2) = 是我之前使用的错误方式,它只允许为以下 if 语句传递数字。

假设 1~9 位数字,'." 将是唯一的输入。

只需要有人帮助我分析这两种方式之间的区别,这样我就可以从错误中吸取教训。

谢谢你的帮助!

public class Solution {
    public boolean isValidSudoku(char[][] board) {
        if (board.length > 9 || board[0].length > 9 || board == null) {
            return false;
        }
        boolean[] brain;
        for (int x = 0; x < board.length; x++) {
            // Reset brain
            brain = new boolean[9];
            for (int y = 0; y < board[0].length; y++) {
                // ------- (1) Begin -------
                if (board[x][y] == '.') {
                    continue;
                }
                if (brain[board[x][y] - '1']) {
                    return false;
                } else {
                    brain[board[x][y] - '1'] = true;
                }
                // ------- (1) End -------
                // statments (1) above is the correct one, I used to use code below:
                /*
                // ------- (2) Begin -------
                if (board[x][y] != '.') {
                    if (brain[board[x][y] - '1']) {
                        return false;
                    } else {
                        brain[board[x][y] - '1'] = true;
                    }
                }
                // ------- (2) Begin -------
                */
                // which failed for not filter out '.' properly
                // so I changed to filter '.' out by using continue;
            }
        }
        for (int x = 0; x < board.length; x++) {
            // Reset brain
            brain = new boolean[9];
            for (int y = 0; y < board[0].length; y++) {
                if (board[y][x] == '.') {
                    continue;
                }
                if (brain[board[y][x] - '1']) {
                    return false;
                } else {
                    brain[board[y][x] - '1'] = true;
                }
            }
        }
        for (int block = 0; block < 9; block++) {
            // Reset brain
            brain = new boolean[9];
            for (int r = block / 3 * 3; r < block / 3 * 3 + 3; r++) {
                for (int c = block % 3 * 3; c < block % 3 * 3 + 3; c++) {
                    if (board[r][c] == '.') {
                        continue;
                    }
                    if (brain[board[r][c] - '1']) {
                        return false;
                    } else {
                        brain[board[r][c] - '1'] = true;
                    }
                }
            }
        }
        return true;
    }
}

在假设数字 1 到 9 和点是您唯一的输入的情况下,您用于跳过数独板上的点的两种方法是等效的。

我尝试使用两个不同的数独板来验证这一点,两种方法都返回了相同的结果。由于我相信这两种方法可以做同样的事情,我认为您将很难找到显示每种方法不同结果的板。

最新更新