Python技术迷

大厂员工爆料:17级以下,晚上基本都在熬工时等夜宵,17级以上开会讨论方案。确实有忙的时候,但一般都是临时问题或者出新版本。。

最近看到一个挺有意思的爆料,来自某大厂的员工,提到了一件事情:17级以下的员工基本上都是在熬工时,等着夜宵,而17级以上的员工大多是在开会讨论方案。听起来是不是有点反讽?

Image

作为一个程序员,我可以理解其中的酸楚。我们这一行,看似拼的是技术和能力,但其实更多的拼的是谁能熬得住,谁能在看似无尽的加班和临时任务中,保持自己的工作状态。

很多时候,不是你写了多少行代码,而是你能不能在深夜和老板讨论一个新的方案时,随时接上话题;不是你解决了多少bug,而是你能不能在团队突然加班时,快速找出问题根源并迅速解决。

对于那些在17级以下的员工,熬夜其实是一种常态。大多数时候,忙的不是那些关键任务,而是临时修修补补、赶赶进度。

Image

说到底,职场技术能力固然重要,但心态、耐力和持久力常常是决定你能走多远的关键。【备注:文末可领最新资料】

算法题:在每个树行中找最大值

今天咱们聊点技术活,题目有点意思:在每个树行中找最大值。

简单来说,就是给你一个二叉树,让你按层找出每层的最大值。这类题目在面试和一些算法练习中挺常见的,虽然看起来不复杂,但也考察了我们对树结构和算法优化的理解。

首先我们得明确一点,啥是树行呢?树行,就是树的每一层。比如,二叉树的第一层就是根节点,第二层是根节点的左右子节点,第三层就是这些节点的子节点,以此类推。

接下来,我们考虑如何高效地从每一层找最大值。咱们可以想到两种常见的方法——BFS(广度优先搜索)和DFS(深度优先搜索)。不过,在这个问题中,BFS显然是更合适的,因为它天然地会按照层来遍历树。而DFS在遍历时,可能会先深入树的某一分支,得不到每层的最大值。

BFS是个好手

BFS的原理很简单,就是逐层遍历,每一层处理完后才去处理下一层。通过使用队列,我们可以很方便地实现这个层级遍历。

首先,咱们得定义一个队列,队列里存储每一层的节点。当我们遍历到当前层时,先取出队列里的节点,找出它们的值,记录当前层的最大值,然后把这些节点的子节点加入队列,继续处理下一层。

这就是标准的BFS处理流程,代码实现起来也不复杂:

from collections import deque

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def largestValues(root):
    if not root:
        return []

        result = []
    queue = deque([root])  # 队列初始化,存入根节点

        while queue:
        level_size = len(queue)  # 当前层的节点数
        level_max = float('-inf')  # 当前层的最大值

                for _ in range(level_size):
            node = queue.popleft()  # 取出当前层的节点
            level_max = max(level_max, node.val)  # 更新当前层的最大值
            if node.left:
                queue.append(node.left)  # 如果左子节点存在,加入队列
            if node.right:
                queue.append(node.right)  # 如果右子节点存在,加入队列

                result.append(level_max)  # 将当前层的最大值加入结果

        return result

一步一步解释

  1. 树的遍历顺序: 我们使用deque队列来存储节点,这样就可以做到按层级逐个遍历。
  2. 每一层的最大值: 每遍历完一层,都会计算并记录最大值,然后进入下一层。
  3. BFS的优势: BFS很自然地将节点按层处理,不需要我们自己去管理“当前层”这种概念,所有子节点都是在当前层遍历完后加入队列,保证了处理的顺序性。

考虑优化

咱们先看看这个代码的复杂度。时间复杂度是O(n),空间复杂度也是O(n),因为我们每次遍历一层,最多会将整棵树的所有节点放入队列。所以,这个解决方案是很高效的。

但话说回来,万一树特别深,内存使用不当可能会让我们的队列爆掉。别担心,这种情况一般出现在极端的树结构里,比如链式的树(即每个节点只有一个子节点)。不过,在常规的二叉树中,队列的大小一般还是可以控制的。

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

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

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