大厂员工爆料:17级以下,晚上基本都在熬工时等夜宵,17级以上开会讨论方案。确实有忙的时候,但一般都是临时问题或者出新版本。。
最近看到一个挺有意思的爆料,来自某大厂的员工,提到了一件事情:17级以下的员工基本上都是在熬工时,等着夜宵,而17级以上的员工大多是在开会讨论方案。听起来是不是有点反讽?
作为一个程序员,我可以理解其中的酸楚。我们这一行,看似拼的是技术和能力,但其实更多的拼的是谁能熬得住,谁能在看似无尽的加班和临时任务中,保持自己的工作状态。
很多时候,不是你写了多少行代码,而是你能不能在深夜和老板讨论一个新的方案时,随时接上话题;不是你解决了多少bug,而是你能不能在团队突然加班时,快速找出问题根源并迅速解决。
对于那些在17级以下的员工,熬夜其实是一种常态。大多数时候,忙的不是那些关键任务,而是临时修修补补、赶赶进度。
说到底,职场技术能力固然重要,但心态、耐力和持久力常常是决定你能走多远的关键。【备注:文末可领最新资料】
算法题:在每个树行中找最大值
今天咱们聊点技术活,题目有点意思:在每个树行中找最大值。
简单来说,就是给你一个二叉树,让你按层找出每层的最大值。这类题目在面试和一些算法练习中挺常见的,虽然看起来不复杂,但也考察了我们对树结构和算法优化的理解。
首先我们得明确一点,啥是树行呢?树行,就是树的每一层。比如,二叉树的第一层就是根节点,第二层是根节点的左右子节点,第三层就是这些节点的子节点,以此类推。
接下来,我们考虑如何高效地从每一层找最大值。咱们可以想到两种常见的方法——BFS(广度优先搜索)和DFS(深度优先搜索)。不过,在这个问题中,BFS显然是更合适的,因为它天然地会按照层来遍历树。而DFS在遍历时,可能会先深入树的某一分支,得不到每层的最大值。
BFS是个好手
BFS的原理很简单,就是逐层遍历,每一层处理完后才去处理下一层。通过使用队列,我们可以很方便地实现这个层级遍历。
首先,咱们得定义一个队列,队列里存储每一层的节点。当我们遍历到当前层时,先取出队列里的节点,找出它们的值,记录当前层的最大值,然后把这些节点的子节点加入队列,继续处理下一层。
这就是标准的BFS处理流程,代码实现起来也不复杂:
from collections import dequeclass 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
一步一步解释
树的遍历顺序: 我们使用 deque队列来存储节点,这样就可以做到按层级逐个遍历。每一层的最大值: 每遍历完一层,都会计算并记录最大值,然后进入下一层。 BFS的优势: BFS很自然地将节点按层处理,不需要我们自己去管理“当前层”这种概念,所有子节点都是在当前层遍历完后加入队列,保证了处理的顺序性。
考虑优化
咱们先看看这个代码的复杂度。时间复杂度是O(n),空间复杂度也是O(n),因为我们每次遍历一层,最多会将整棵树的所有节点放入队列。所以,这个解决方案是很高效的。
但话说回来,万一树特别深,内存使用不当可能会让我们的队列爆掉。别担心,这种情况一般出现在极端的树结构里,比如链式的树(即每个节点只有一个子节点)。不过,在常规的二叉树中,队列的大小一般还是可以控制的。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。