Python技术迷

某大厂员工吐槽:领导要求写日报,必须精确到每半小时干了啥。结果昨晚停电半小时,我就如实写了,第二天领导问我为什么那半小时没干活?

作为一个程序员,我最常接触的就是各种日报,周报,月报。写日报的意义是什么?我觉得很多时候就是一种自我安慰吧——“我今天有工作,我很忙。”但是,有时候,领导要求也能让人哭笑不得。

比如我前几天碰到的事,真是让我差点气笑了。

公司领导要求我们写日报,要求精确到每半小时干了啥。

有一天晚上,停电了,没网没电,完全没法工作,我只好在日报里如实写了“停电,无法工作”。第二天,领导看到我的日报,居然问我:“为什么那半小时没工作?”😓

Image

我当时心里一万只草泥马奔腾而过。停电啊,老铁!难道我能在黑暗中凭空编程不成?

你说,这种要求,怎么可能不让人产生抵触情绪呢?【备注:文末可领最新资料】

算法题:情侣牵手

今天咱们聊个“有点甜”的话题:情侣牵手。说实话,听到这个题目,肯定有人第一时间想到的不是算法,而是浪漫的街头,牵着心爱的人的手走。

首先,题目给出的背景是这样的:我们有两个情侣站在一个序列中的不同位置,如何计算他们能够牵手的最短路径,假设他们在一个类似于二维平面(比如一个网格)中,A 点和 B 点是情侣的位置,怎么让他们牵手?基本就是找到他们之间的最短路径。

这类问题涉及到的常见算法就是 最短路径算法。对于一个平面网格上的最短路径问题,最常用的算法是 BFS(广度优先搜索)。因为它特别适合用于计算无权图(比如没有权重的网格)中的最短路径。

问题分析

假设我们有一个 N x M 的网格,其中 1 代表空地,0 代表障碍物,情侣从一个位置走到另一个位置。在这个问题中,我们的目标就是计算出从情侣 A 到情侣 B 之间的最短路径长度(如果能牵手的话)。

算法思路:

  1. BFS:从情侣 A 所在位置出发,进行广度优先搜索,逐步探索相邻的格子。每次走到一个新的格子,就将其加入到队列中,直到找到情侣 B 的位置,或者遍历完所有可能的路径。

  2. 边界条件:需要注意的是,网格内可能存在障碍物(0),这时情侣不能穿越这些障碍物。所以,必须把这些障碍物从搜索路径中排除。

  3. 返回值:如果能够找到情侣 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}")

代码解析

  1. is_valid 函数:这个函数用于判断某个位置是否在网格范围内,并且该位置是否是空地(1),同时也需要确保该位置没有被访问过。

  2. bfs 函数:核心的广度优先搜索算法。我们从情侣 A 的起始位置出发,一步一步向周围扩展,直到找到情侣 B 的位置或者搜索完所有可能的路径。每次扩展时,都将当前位置的坐标和当前步数加入队列。

  3. 结果输出:如果找到了情侣 B 的位置,就输出最短路径的步数;如果找不到,就返回 -1,表示无路径。

复杂度分析

  • 时间复杂度:BFS 算法的时间复杂度是 O(N * M),其中 N 和 M 分别是网格的行数和列数。因为每个格子最多被访问一次。
  • 空间复杂度:需要一个与网格同样大小的 visited 数组,所以空间复杂度也是 O(N * M)。

结尾

说到这,可能大家有个疑问:如果情侣 A 和 B 之间有障碍物该怎么办?其实就像真实生活中,障碍物并不一定会把我们彻底隔离。比如在职场中,有时一些困难和挑战也会出现,但只要采取对的方法,突破障碍也能实现目标。这个算法就像解决职场问题一样,有时候找对方法(比如 BFS)就能顺利到达目标。

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。