Algorithm做算法题,Review点评英文文章,Tip总结技术技巧,Share做技术分享。每周打卡一次,这就是ARTS打卡。
1. 做算法题
LeetCode289题. 生命游戏
题目描述:
根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。
示例:输入:
[
[0,1,0],
[0,0,1],
[1,1,1],
[0,0,0]
]
输出:
[
[0,0,0],
[1,0,1],
[0,1,1],
[0,1,0]
]
**解题思路:**题目有个关键点,同时更新,也就是说根据当前的状态同时更新下一个状态。如果要使用本地算法(不开辟额外空间),就需要使用临时状态,如活到死用-1表示,死到活用2表示。还有一个问题要考虑,边界。用一个元组列表代表八个方向的移动,移动后的位置判断是否超出模板。
解题代码:
class Solution:
def gameOfLife(self, board: List[List[int]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
neighbors = [(-1,-1), (-1,0), (0,-1), (1,-1), (-1,1), (1,0), (0,1), (1,1)]
row_len = len(board)
col_len = len(board[0])
for row in range(row_len):
for col in range(col_len):
neighbor_lives = 0
for neighbor in neighbors:
r = row + neighbor[0]
c = col + neighbor[1]
if r >= 0 and r < row_len and c >= 0 and c < col_len and abs(board[r][c]) ==1:
neighbor_lives += 1
if board[row][col] == 0 and neighbor_lives == 3:
board[row][col] = 2
if board[row][col] == 1 and (neighbor_lives < 2 or neighbor_lives >3):
board[row][col] = -1
for row in range(row_len):
for col in range(col_len):
if board[row][col] == 2:
board[row][col] = 1
elif board[row][col] == -1:
board[row][col] = 0
2.点评英文文章
文章I know Python basics, what next?介绍了有一定Python基础后如何继续深入学习和使用Python,包含丰富的学习资源。
3.技术技巧
为了防止恶意攻击网站会验证操作者是机器还是正常用户,常用的方法有图片验证码、短信验证码和拖动方块等方式。这些验证方法都需要用户进行操作,还有一种无需用户操作的方式进行验证,Friendly Captcha,在线尝试一下。
4.技术分享
作为微信读书的重度用户,一直用手机看书,看得时间长了总是眼睛痛。用电纸书能很好缓解眼睛疲劳。用电纸书安装微信阅读过程参考。