原题:
The Sudoku board could be partially filled, where empty cells are filled with the character
'.'
.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
判断这个数独里给定的数字是否有问题,也就是判断每一行、每一列以及每一个九宫格是否有重复数字。
思考过程&解题思路:
一开始没什么好想法,觉得每次判断都要遍历整个char[][],然后百度一下,发现都没什么好想法,那就硬解了。当然每次遍历都用一个哈希表,存储已经遍历到的数字,省得做多余比较。
结果代码:
public boolean isValidSudoku(char[][] board) {
for (int i = 0;i < 9;i++){//每一横行判断是否有重复
Map<Character,Integer> hasMap = new HashMap<>();
for (int j = 0;j < 9;j++){
if (board[i][j] != '.') {
if (hasMap.containsKey(board[i][j])) return false;
else hasMap.put(board[i][j],j);
}
}
}
for (int i = 0;i < 9;i++){///每一列判断是否有重复
Map<Character,Integer> hasMap = new HashMap<>();
for (int j = 0;j < 9;j++){
if (board[j][i] != '.'){
if (hasMap.containsKey(board[j][i])) return false;
else hasMap.put(board[j][i],j);
}
}
}
for (int i = 0;i < 9;i += 3)//每一九宫格判断是否有重复
for (int j = 0;j < 9;j += 3){//i,j用于确定九宫格最左上角的点,k,l用于遍历九宫格
Map<Character,Integer> hasMap = new HashMap<>();
for (int k = i;k < i + 3;k++)
for (int l = j;l < j + 3;l++)
if (board[k][l] != '.') {
if (hasMap.containsKey(board[k][l])) return false;
else hasMap.put(board[k][l], j);
}
}
return true;
}