leetcode 37. 搜索插入位置 38. 有效的数独
37. 解数独
难度困难945收藏分享切换为英文接收动态反馈
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.'
表示。
示例:
输入: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"]]
输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:
提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位数字或者'.'
- 题目数据 保证 输入数独仅有一个解
通过次数98,547
提交次数147,009
# -*- coding: utf-8 -*-
import copy
from typing import List
import imghdr
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
def dfs(pos:int):
nonlocal valid
#如果space查完了 返回
if pos == len(space):
valid = True
return
x,y = space[pos]
for i in range(0,9):
if row[x][i] == col[y][i] == bevel[x//3][y//3][i] == False:
row[x][i] = col[y][i] = bevel[x // 3][y // 3][i] = True
board[x][y] = str(i + 1)
dfs(pos+1)
row[x][i] = col[y][i] = bevel[x // 3][y // 3][i] = False
if valid:
return
#param pos 空位置的坐标
pass
#创建行 列 宫格 False是。 用来存1-9
col = [[False] * 9 for _ in range(0,9)]
row = [[False] * 9 for _ in range(0,9)]
bevel = [[[False] * 9 for _b in range(0, 3)] for _a in range(0, 3)]
valid = False
#用来存是.的 xy
space = list()
for i in range(0,9):
for i2 in range(0,9):
if board[i][i2] == ".":
space.append((i,i2))
else:
# ==true的代表 存在的值
dis = int(board[i][i2]) - 1
col[i2][dis] = row[i][dis] = bevel[i//3][i2//3][dis] = True
#从第0个.的位置开始查找
dfs(0)
def solveSudoku(self, board: List[List[str]]) -> None:
def flip(i: int, j: int, digit: int):
line[i] ^= (1 << digit)
column[j] ^= (1 << digit)
block[i // 3][j // 3] ^= (1 << digit)
def dfs(pos: int):
nonlocal valid
if pos == len(spaces):
valid = True
return
i, j = spaces[pos]
mask = ~(line[i] | column[j] | block[i // 3][j // 3]) & 0x1ff
while mask:
digitMask = mask & (-mask)
digit = bin(digitMask).count("0") - 1
flip(i, j, digit)
board[i][j] = str(digit + 1)
dfs(pos + 1)
flip(i, j, digit)
mask &= (mask - 1)
if valid:
return
line = [0] * 9
column = [0] * 9
block = [[0] * 3 for _ in range(3)]
valid = False
spaces = list()
for i in range(9):
for j in range(9):
if board[i][j] == ".":
spaces.append((i, j))
else:
digit = int(board[i][j]) - 1
flip(i, j, digit)
dfs(0)
if __name__ == '__main__':
board = [["5", "3", "1", "2", "7", "6", "8", "9", "4"]
, ["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"]]
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"]]
b = [["5", "3", "4", "6", "7", "8", "9", "1", "2"], ["6", "7", "2", "1", "9", "5", "3", "4", "8"],
["1", "9", "8", "3", "4", "2", "5", "6", "7"], ["8", "5", "9", "7", "6", "1", "4", "2", "3"],
["4", "2", "6", "8", "5", "3", "7", "9", "1"], ["7", "1", "3", "9", "2", "4", "8", "5", "6"],
["9", "6", "1", "5", "3", "7", "2", "8", "4"], ["2", "8", "7", "4", "1", "9", "6", "3", "5"],
["3", "4", "5", "2", "8", "6", "1", "7", "9"]]
print(Solution().solveSudoku(board))
# a = 0
# a ^= (1 << 4)
# print(a)
# print(False == False == False)
38. 外观数列
难度中等743收藏分享切换为英文接收动态反馈
给定一个正整数 n
,输出外观数列的第 n
项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
你可以将其视作是由递归公式定义的数字字符串序列:
countAndSay(1) = "1"
countAndSay(n)
是对countAndSay(n-1)
的描述,然后转换成另一个数字字符串。
前五项如下:
1. 1
2. 11
3. 21
4. 1211
5. 111221
第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。
例如,数字字符串 "3322251"
的描述如下图:
示例 1:
输入:n = 1
输出:"1"
解释:这是一个基本样例。
示例 2:
输入:n = 4
输出:"1211"
解释:
countAndSay(1) = "1"
countAndSay(2) = 读 "1" = 一 个 1 = "11"
countAndSay(3) = 读 "11" = 二 个 1 = "21"
countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"
提示:
1 <= n <= 30
class Solution:
def countAndSay(self, n: int) -> str:
s = "1"
for _ in range(n - 1):
j = 0
res = ""
for i in range(1,len(s) + 1):
if len(s) == i or s[i] != s[i - 1]:
res += str(i - j) + s[i - 1]
j = i
s = res
return s
def countAndSay3(self, n: int) -> str:
def getAns(n,s:str):
length = len(s)
if n <= 0:
return s
ans = ""
a = s[0]
for i in range(1, length):
if a[0] == s[i]:
a += s[i]
else:
ans += str(len(a)) + a[0]
a = s[i]
ans += str(len(a)) + a[0]
return getAns(n-1, ans)
ans = "1"
if n == 1:
return ans
ans += "1"
n -= 2
return getAns(n, ans)
def countAndSay2(self, n: int) -> str:
def get_ans(s: str):
length = len(s)
a = s[0]
ans = ""
for i in range(1, length):
if a[0] == s[i]:
a += s[i]
else:
ans += str(len(a)) + a[0]
a = s[i]
if a != "":
ans += str(len(a)) + a[0]
return ans
if n == 1:
return "1"
elif n == 2:
return "11"
elif n == 3:
return "21"
elif n == 4:
return "1211"
elif n == 5:
return "111221"
ans = "111221"
for i in range(n-5):
ans = get_ans(ans)
return ans
if __name__ == '__main__':
print(Solution().countAndSay(6))
return "21"
elif n == 4:
return "1211"
elif n == 5:
return "111221"
ans = "111221"
for i in range(n-5):
ans = get_ans(ans)
return ans
if __name__ == '__main__':
print(Solution().countAndSay(6))