某大厂员工吐槽:领导要求写日报,必须精确到每半小时干了啥。结果昨晚停电半小时,我就如实写了,第二天领导问我为什么那半小时没干活?
作为一个程序员,我最常接触的就是各种日报,周报,月报。写日报的意义是什么?我觉得很多时候就是一种自我安慰吧——“我今天有工作,我很忙。”但是,有时候,领导要求也能让人哭笑不得。
比如我前几天碰到的事,真是让我差点气笑了。
公司领导要求我们写日报,要求精确到每半小时干了啥。
有一天晚上,停电了,没网没电,完全没法工作,我只好在日报里如实写了“停电,无法工作”。第二天,领导看到我的日报,居然问我:“为什么那半小时没工作?”😓
我当时心里一万只草泥马奔腾而过。停电啊,老铁!难道我能在黑暗中凭空编程不成?
你说,这种要求,怎么可能不让人产生抵触情绪呢?【备注:文末可领最新资料】
算法题:情侣牵手
今天咱们聊个“有点甜”的话题:情侣牵手。说实话,听到这个题目,肯定有人第一时间想到的不是算法,而是浪漫的街头,牵着心爱的人的手走。
首先,题目给出的背景是这样的:我们有两个情侣站在一个序列中的不同位置,如何计算他们能够牵手的最短路径,假设他们在一个类似于二维平面(比如一个网格)中,A 点和 B 点是情侣的位置,怎么让他们牵手?基本就是找到他们之间的最短路径。
这类问题涉及到的常见算法就是 最短路径算法。对于一个平面网格上的最短路径问题,最常用的算法是 BFS(广度优先搜索)。因为它特别适合用于计算无权图(比如没有权重的网格)中的最短路径。
问题分析
假设我们有一个 N x M 的网格,其中 1 代表空地,0 代表障碍物,情侣从一个位置走到另一个位置。在这个问题中,我们的目标就是计算出从情侣 A 到情侣 B 之间的最短路径长度(如果能牵手的话)。
算法思路:
BFS:从情侣 A 所在位置出发,进行广度优先搜索,逐步探索相邻的格子。每次走到一个新的格子,就将其加入到队列中,直到找到情侣 B 的位置,或者遍历完所有可能的路径。
边界条件:需要注意的是,网格内可能存在障碍物(
0),这时情侣不能穿越这些障碍物。所以,必须把这些障碍物从搜索路径中排除。返回值:如果能够找到情侣 B 的位置,那么就返回最短路径的长度。如果找不到路径,则返回
-1,表示无法牵手。
算法实现
用 Python 实现这个算法大概长这样:
from collections import deque
# 定义四个方向:上下左右
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
defis_valid(x, y, n, m, grid, visited):
return0 <= x < n and0 <= y < m and grid[x][y] == 1andnot visited[x][y]
defbfs(start, end, n, m, grid):
# 用队列保存当前的坐标和步数
queue = deque([(start[0], start[1], 0)]) # (x, y, steps)
visited = [[False] * m for _ in range(n)]
visited[start[0]][start[1]] = True
while queue:
x, y, steps = queue.popleft()
# 如果找到了情侣B的位置,直接返回步数
if (x, y) == end:
return steps
# 否则继续扩展
for dx, dy in directions:
nx, ny = x + dx, y + dy
if is_valid(nx, ny, n, m, grid, visited):
visited[nx][ny] = True
queue.append((nx, ny, steps + 1))
return-1# 如果没有找到路径
# 示例
n, m = 5, 5
grid = [
[1, 1, 1, 1, 0],
[1, 0, 0, 1, 0],
[1, 0, 1, 1, 1],
[1, 0, 1, 0, 1],
[1, 1, 1, 1, 1]
]
start = (0, 0) # 情侣A的起始位置
end = (4, 4) # 情侣B的目标位置
steps = bfs(start, end, n, m, grid)
print(f"最短牵手路径长度: {steps}")
代码解析
is_valid函数:这个函数用于判断某个位置是否在网格范围内,并且该位置是否是空地(1),同时也需要确保该位置没有被访问过。bfs函数:核心的广度优先搜索算法。我们从情侣 A 的起始位置出发,一步一步向周围扩展,直到找到情侣 B 的位置或者搜索完所有可能的路径。每次扩展时,都将当前位置的坐标和当前步数加入队列。结果输出:如果找到了情侣 B 的位置,就输出最短路径的步数;如果找不到,就返回
-1,表示无路径。
复杂度分析
时间复杂度:BFS 算法的时间复杂度是 O(N * M),其中 N 和 M 分别是网格的行数和列数。因为每个格子最多被访问一次。 空间复杂度:需要一个与网格同样大小的 visited 数组,所以空间复杂度也是 O(N * M)。
结尾
说到这,可能大家有个疑问:如果情侣 A 和 B 之间有障碍物该怎么办?其实就像真实生活中,障碍物并不一定会把我们彻底隔离。比如在职场中,有时一些困难和挑战也会出现,但只要采取对的方法,突破障碍也能实现目标。这个算法就像解决职场问题一样,有时候找对方法(比如 BFS)就能顺利到达目标。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。