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 和点是您唯一的输入的情况下,您用于跳过数独板上的点的两种方法是等效的。
我尝试使用两个不同的数独板来验证这一点,两种方法都返回了相同的结果。由于我相信这两种方法可以做同样的事情,我认为您将很难找到显示每种方法不同结果的板。