一、题目
1、审题
2、分析
一个 9 * 9 的棋盘,其中 ‘ . ’ 代表未填写,判断其中填写的数字是否符合如下特点:
a、每行的数字不重复
b、每列的数字不重复
c、每个3*3 的小棋盘中数字不重复
二、解答
1、思路:
用双层循环,其中外循环 i 代表 X 轴坐标, j 代表 Y轴坐标。 则 [i, j] 为每一行的坐标, [j, i] 为每一列的坐标。同时, [i /3 * 3 + j / 3 , i % 3 * 3 + j % 3] 正好为第 i 个3* 3单元格的第 j 个格点坐标。最终利用 Set 判断数字是否重复。
public class Solution { public boolean isValidSudoku(char[][] board) { // 因此第i个九宫格的第j个格点的行号可表示为i/3*3+j/3 // i / 3 * 3 + j / 3 for (int i = 0; i < 9; i++) { // 表示第 i 个九宫格 HashSet<Character> row = new HashSet<Character>(); HashSet<Character> column = new HashSet<Character>(); HashSet<Character> cube = new HashSet<Character>(); // 检查第 i 行 for (int j = 0; j < 9; j++) { // 横坐标 if(board[i][j] != '.' && !row.add(board[i][j])) return false; // 纵坐标 if(board[j][i] != '.' && !column.add(board[j][i])) return false; // 九宫格 坐标 int rowNum = i / 3 * 3 + j / 3; int columnNum = i % 3 * 3 + j % 3; if(board[rowNum][columnNum] != '.' && !cube.add(board[rowNum][columnNum])) return false; } } return true; } }