1、有效的数独
示例 1:
输入:board =
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:true
示例 2:
输入:board =
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:false
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
var rowMap = new Map(); //创建行的hash表
var columnMap = new Map(); //创建列的hash表
var circleMap = new Map(); //创建3*3的hash表
for(var i=0; i<board.length; i++){ //循环行的长度
for(var j=0; j<board[i].length; j++){//循环列的长度
if(board[i][j]==='.'){ //如果这个元素不是数字就继续
continue;
}
if(rowMap.get(`${i}_${board[i][j]}`)){ // 检查当前数字在当前行是否已经出现过,如果出现则返回false
return false
}else{
rowMap.set(`${i}_${board[i][j]}`,true)// 将当前数字标记为已经出现
}
if(columnMap.get(`${j}_${board[i][j]}`)){// 检查当前数字在当前列是否已经出现过,如果出现则返回false
return false
}else{
columnMap.set(`${j}_${board[i][j]}`,true)// 将当前数字标记为已经出现
}
if(circleMap.get(`${Math.floor(i/3)}_${Math.floor(j/3)}_${board[i][j]}`)){ // 检查当前数字在当前3x3小九宫格内是否已经出现过,如果出现则返回false
return false
}else{
circleMap.set(`${Math.floor(i/3)}_${Math.floor(j/3)}_${board[i][j]}`,true) // 将当前数字标记为已经出现
}
}
}
return true // 若通过上述检查,返回true,表示数独有效
};
-
if(rowMap.get(
${i}_${board[i][j]}))
:首先,使用rowMap.get(
${i}_${board[i][j]})
来检查当前行中的当前数字是否已经在rowMap
中出现过。如果rowMap
中存在以${i}_${board[i][j]}
作为键的值,即表示当前数字在当前行已经出现过。此时条件成立,执行代码块中的内容。 -
return false;
:如果条件成立,即表示当前数字在当前行已经出现过,因此函数返回 false,表示数独不符合规则。 -
rowMap.set(
${i}_${board[i][j]}, true);
:如果当前数字在当前行没有出现过,那么将其标记为已经出现。在这里,我们使用rowMap
的 set 方法,以${i}_${board[i][j]}
作为键,并将值设置为true
,表示当前数字已经在当前行中出现过
2、旋转图像
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
var rotate = function(matrix) {
const n = matrix.length; //获取矩阵大小
const matrix_new = new Array(n).fill(0).map(() => new Array(n).fill(0)); //新建一个矩阵用0将所有元素填满
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
matrix_new[j][n - i - 1] = matrix[i][j]; //此为二维数组常用旋转对应表达式
}
}
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
matrix[i][j] = matrix_new[i][j]; //最后在把新建数组的值进行覆盖操作
}
}
};