36
题目描述:
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
示例:
解答:
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
matrix_line = [set() for i in range(9)]
matrix_column = [set() for i in range(9)]
matrix_area = [set() for i in range(9)]
for i in range(9):
for j in range(9):
item = board[i][j]
pos = (i//3)*3 + j //3
if item != '.':
if item not in matrix_line[i] and item not in matrix_column[j] and item not in matrix_area[pos]:
matrix_line[i].add(item)
matrix_column[j].add(item)
matrix_area[pos].add(item)
else:
return False
return True
37
题目描述:
编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
示例:
解答:
class Solution:
def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
def check(x, y, s):
for i in range(9):
if board[i][y] == s or board[x][i] == s:
return False
for i in [0, 1, 2]:
for j in [0, 1, 2]:
if board[x//3*3+i][y//3*3+j] == s:
return False
return True
def bt(cur):
if cur == 81:
return True
x, y = cur // 9, cur % 9
if board[x][y] != '.':
return bt(cur + 1)
for i in range(1, 10):
s = str(i)
if check(x, y, s):
board[x][y] = s
if bt(cur + 1):
return True
board[x][y] = '.'
return False
bt(0)
589
题目描述:
给定一个 N 叉树,返回其节点值的 前序遍历 。
N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例:
解答:
if not root:
return []
s = [root]
# s.append(root)
res = []
while s:
node = s.pop()
res.append(node.val)
# for child in node.children[::-1]:
# s.append(child)
s.extend(node.children[::-1])
return res
897
题目描述:
给你一个树,请你 按中序遍历 重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点。
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def increasingBST(self, root: TreeNode) -> TreeNode:
#辅助栈模拟中序遍历,并将原树重排
s=[]
dummy=TreeNode(0)
p=dummy
while s or root:
if root:
s.append(root)
root=root.left
else:
cur=s.pop()
root=cur.right
cur.left=None
p.right=cur
p=p.right
return dummy.right
面试题04.03
题目描述:
给定一棵二叉树,设计一个算法,创建含有某一深度上所有节点的链表(比如,若一棵树的深度为 D,则会创建出 D 个链表)。返回一个包含所有深度的链表的数组。
示例:
解答:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def listOfDepth(self, tree: TreeNode) -> List[ListNode]:
stack = [tree]
result = []
while stack:
dummy = ListNode(None)
prev = dummy
for i in range(len(stack)):
curr = stack.pop(0)
newNode = ListNode(curr.val)
prev.next = newNode
prev = prev.next
if curr.left: stack.append(curr.left)
if curr.right: stack.append(curr.right)
result.append(dummy.next)
return result