有效的数独
题目:有效的数独 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
按题目内容依次判断行、列一节子宫格是否数据重复,利用set来校验字符是否重复。
const isValidSudoku = (arr: Array<Array<string>>) => {
const isOnlyNum = (arr: Array<string>) => {
const setArr = new Set(arr)
return setArr.size == arr.length
}
// 行
for (let i = 0; i < 9; i++) {
const subArr = arr[i].filter((e) => e != '.')
if (!isOnlyNum(subArr)) {
console.log('行', subArr)
return false
}
}
// 列
for (let i = 0; i < 9; i++) {
const subArr = arr.map((el) => el[i]).filter((e) => e != '.')
if (!isOnlyNum(subArr)) {
console.log('列', subArr)
return false
}
}
// 子宫格3*3
for (let i = 0; i < 9; i++) {
const x = i % 3
const y = Math.floor(i / 3)
const subArr = arr
.slice(y * 3, y * 3 + 3)
.reduce((r, a) => {
r.push(...a.slice(x * 3, x * 3 + 3))
return r
}, [])
.filter((a) => a != '.')
if (!isOnlyNum(subArr)) {
console.log('子', subArr, x, y)
return false
}
}
return true
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
上次更新: 2025/09/05, 8:09:00