图
输入描述
第一行包含两个整数N,M,表示矩阵的行数和列数。
后续N行,每行包含M个数字,数字为1或者0.
输出描述
输出一个整数,表示岛屿的数量。如果不存在岛屿,则输出0.
输入示例
4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1
n, m = map(int, input().split())
grid = []
for i in range(n):
grid.append(list(map(int, input().split())))
import sys
n, m = map(int, sys.stdin.readline().split())
grid = []
for i in range(n):
grid.append(list(map(int, sys.stdin.readline().split())))
如果输入的时 string 形式的 list 结果:
输入
[[1, 1, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 1]]
使用 read(),一次性读入所有字符串
然后使用 eval()
,执行字符串,解析为 list 对象,最终得到期望的 list
结果
import sys
grid = sys.stdin.read()
grid = eval(grid)
print(grid)
链表
# 定义链表结构
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def nums2ListNode(nums):
dummy = ListNode()
head = ListNode(nums[0])
dummy.next = head
for x in nums[1:]: # 遍历 head 之后的结点
node = ListNode(x)
head.next = node
head = head.next
head.next = None
return dummy.next # 返回头结点
验证
# 打印链表
res = []
nums = [1, 2, 3, 4, 5]
print("数组为:", nums)
root = nums2ListNode(nums)
while root:
res.append(root.val)
root = root.next
print("\n打印链表:", res)
二叉树
二叉树的输入就是层次遍历的顺序
如果父节点的数组下标是 i
,那么它的左孩子下标就是 i * 2 + 1
,右孩子下标就是 i * 2 + 2
# 定义二叉树
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def nums2TreeNode(nums, empty_node=None):
# empty_node, 空结点用什么符号表示
if not nums:
return None
n = len(nums)
# 将 nums 全部转为 TreeNode
Tree = [] # 存储树节点
for i in range(n):
if nums[i] == empty_node:
node = None
else:
node = TreeNode(nums[i])
Tree.append(node)
root = Tree[0]
for i in range(n):
if Tree[i]: # 如果不为空结点, 则找到对应的左右结点
if i * 2 + 1 < n:
Tree[i].left = Tree[i * 2 + 1]
if i * 2 + 2 < n:
Tree[i].right = Tree[i * 2 + 2]
return root
验证
def dfs(root):
if not root:
return
dfs(root.left)
ans.append(root.val)
dfs(root.right)
nums = [3, 9, 20, -1, -1, 15, 7]
root = nums2TreeNode(nums, empty_node=-1)
ans = []
dfs(root)
print(ans)
[9, 3, 15, 20, 7]