Python技术迷

面试被挂的原因竟然是,搜了女仆。。

话说面试这事儿,每个人都不容易,既要展示技术,又要注意形象,分分钟都在和自己的“社交形象”较劲。

不过,今天的主角可真是把这一点做得淋漓尽致——他的“面试之路”被一个小小的意外彻底打乱了。

事情是这样的:面试官给了候选人不错的技术评价,沟通也非常流畅。但就在共享屏幕时,候选人一不小心展示出了浏览器的历史记录…结果,里面居然出现了“女仆xxx”相关的搜索内容。

Image

这一下,面试官真的是无话可说,只能在面评里写:“候选人的技术扎实,沟通能力强,但共享屏幕时看到了些不该看的内容……”

Image

虽然这事儿看似无关紧要,但在职场上,尤其是面试这种关键时刻,稍有不慎就可能让你“栽跟头”。想想你准备了几个月的技术面,最后却因为一个无心之举被面试官记住,简直让人有点儿“憋屈”。

我个人觉得,大家平时在面试时,清理下桌面,关闭不必要的窗口和历史记录真的很重要。毕竟面试不仅仅是技术的较量,更是展现你整个人格魅力的时刻。所以,保持好专业态度,避免给自己留下“锅”是非常必要的。【备注:文末可领最新资料】。

算法题:到达终点

今天咱们聊点实际的东西。说到编程题,算法题永远都是个永远不过时的“经典”。你知道,像面试题目常常会给你这种——“到达终点”的题目,让你思考在一个迷宫或图形结构中如何快速有效地找到到达终点的路径。

题目大概描述:

假设有一个二维的网格,起点是 (0, 0),终点是 (n-1, n-1),我们只能在网格内上下左右移动,每一次只能走一步,判断是否能够到达终点。

有点像小时候玩的一款经典迷宫游戏,图形上每个位置都有数字代表是可行走的路或障碍,目标是找到一条最短的路径,从起点走到终点。

现在,你要做的就是设计一个算法来判断,是否存在一条可行的路径。

思路

对于这种问题,大家通常会用广度优先搜索(BFS)来解。简单来说,BFS的基本操作就是从起点开始,逐层向四周扩展,直到遍历到终点。为什么是广度优先呢?因为它是按层次遍历的,最先遍历到的就是最短路径。

就像是你拿着一个大喇叭,从起点出发,每次呼叫四个方向的人帮忙扩散,一直到达终点。这个算法特别适合“最短路径”这种情况,因为每一步扩展都是“最小代价”的。

步骤分析

  1. 初始化:首先,我们需要一个队列(queue),这是用来存放我们要访问的每个位置的。起点 (0, 0) 加入队列。
  2. 遍历:每次从队列中取出一个元素,检查它的四个邻居是否是有效且可行的。如果是,就把这些邻居加入队列。
  3. 终止条件:一旦我们遍历到终点,就说明路径存在,可以直接返回“到达”。如果队列为空,说明没有可行路径,返回“无法到达”。
  4. 边界条件:当然,也要考虑一些边界情况,比如起点本身就是终点,或者整个网格一开始就被障碍物堵住了。

代码实现

好吧,废话不多说,直接给出代码:

from collections import deque

def canReachEnd(grid):
    # 获取网格的行列数
    n = len(grid)

        # 如果起点或终点被堵住,直接返回False
    if grid[0][0] == 1 or grid[n-1][n-1] == 1:
        return False

    # 定义四个方向:上、下、左、右
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]

        # 创建一个队列,初始化时把起点(0, 0)加入队列
    queue = deque([(0, 0)])

    # 创建一个visited数组,标记已访问的节点
    visited = [[False for _ in range(n)] for _ in range(n)]
    visited[0][0] = True

    while queue:
        x, y = queue.popleft()

        # 如果到达终点,返回True
        if (x, y) == (n-1, n-1):
            return True

                # 检查四个方向
        for dx, dy in directions:
            nx, ny = x + dx, y + dy

            # 判断新的坐标是否在网格内,且未被访问过,且不是障碍物
            if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny] and grid[nx][ny] == 0:
                visited[nx][ny] = True
                queue.append((nx, ny))

        # 如果队列为空,说明无法到达终点
    return False

解释

  1. grid 是一个二维数组,表示迷宫的结构,0 表示可行走,1 表示障碍物。
  2. 我们通过 deque 来模拟队列,这比普通的列表更高效,因为它能在两端进行快速插入和删除。
  3. 通过四个方向的遍历,我们逐步检查每一个可能的路径。
  4. 终点 (n-1, n-1) 是我们的目标,一旦访问到就返回 True,表示能够到达。
  5. 如果遍历完所有的可能路径都没有到达终点,那就返回 False。

测试

我们来测试一下代码:

# 示例 1:有路径
grid1 = [
    [0, 0, 1, 0],
    [0, 1, 0, 0],
    [0, 1, 0, 1],
    [0, 0, 0, 0]
]

# 示例 2:无路径
grid2 = [
    [0, 0, 1, 0],
    [1, 1, 0, 0],
    [1, 1, 0, 1],
    [1, 1, 0, 0]
]

print(canReachEnd(grid1))  # 输出: True
print(canReachEnd(grid2))  # 输出: False

总结

这个算法的时间复杂度是 O(n^2),因为我们最坏情况下会遍历所有的格子。空间复杂度也是 O(n^2),用于存储访问标记和队列。

总的来说,BFS 在路径搜索中是非常高效且经典的一个解决方案。解决这类“到达终点”的问题时,记得拿出 BFS,让它帮你打通关!

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

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

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