Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
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.
题目分析:由于一次最多只需要检查9个数字,1 << 9 < INT_MAX,因此可以用整型数字的二进制位来判断某个数字是否出现过,击败95%
public class Solution {
public boolean isValidSudoku(char[][] board) {
int mask = 0, num = 0;
for (int i = 0; i < 9; i ++) {
mask = 0;
for (int j = 0; j < 9; j ++) {
if (board[i][j] != '.') {
num = board[i][j] - '0';
if ((mask & (1 << num)) == 0) {
mask |= (1 << num);
} else {
return false;
}
}
}
}
for (int j = 0; j < 9; j ++) {
mask = 0;
for (int i = 0; i < 9; i ++) {
if (board[i][j] != '.') {
num = board[i][j] - '0';
if ((mask & (1 << num)) == 0) {
mask |= (1 << num);
} else {
return false;
}
}
}
}
for (int i = 0; i < 3; i ++) {
for (int j = 0; j < 3; j ++) {
int x = i * 3;
int y = j * 3;
mask = 0;
for (int k = 0; k < 3; k ++) {
for (int l = 0; l < 3; l ++) {
if (board[x + k][y + l] != '.') {
num = board[x + k][y + l] - '0';
if ((mask & (1 << num)) == 0) {
mask |= (1 << num);
} else {
return false;
}
}
}
}
}
}
return true;
}
}