网友吐槽:男友19年入职字节,现在月薪9万,在北京买了房,那时候他可风光了,可5年过去了,身体越来越虚。。

科技   2024-12-19 11:39   陕西  
这两天看到一个网友吐槽,内容让我想了好多。说的是她男朋友2019年入职字节,工资已经涨到了9万/月,而且在北京买了房。
当时看起来,人生真是“赢”在了起跑线嘛,仿佛一切都顺风顺水,羡煞旁人。
但时间过去了五年,事情有了不小的变化。
现在男友虽然收入不低,可身体却越来越虚弱,整天好像有点透支的感觉。换句话说,不仅是钱赚得快,身体的“账单”也一并被寄到了他那儿。

作为程序员,我特别能理解这种状况。我们都知道,编程这活坐在电脑前,眼睛疲劳、脖子僵硬、腰背痛,这些小毛病似乎成了“标配”。时间久了,做得再好,生活质量却越来越差,特别是在大城市里,节奏快、压力大,身心双重打击,谁能不虚呢?
所以,工作重要,但别忘了调节身心。职业生涯再好,若身体撑不住,一切都得打折扣。希望大家在追逐目标的同时,别忘了给身体“放个假”。💻

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

写到算法题,大家都知道,树这种数据结构真的是既深且广。今天这个问题,听起来很简单:在每个树行中找最大值,其实做起来有些许的挑战。
话说,深度优先遍历和广度优先遍历的“战斗”真的是每个算法面试题的经典啊,而这个题目也不例外,要求我们在每一层找出最大值,那么到底应该怎么做呢?

问题分析

首先,给定一棵二叉树,你的目标是找出每一层的最大值。听起来像是某个高阶数据结构中的典型应用题。直觉上,这个问题的解决方式就得利用“层次遍历”(也就是广度优先遍历,BFS)。为什么呢?因为层次遍历就是按行遍历树的每个节点,这样我们就能轻松地一层一层地处理每一层的节点,方便我们找出最大值。

解题思路

我们用一个队列(Queue)来帮助我们进行层次遍历。队列是 BFS 的标准工具,它能够保证我们每次拿到的都是当前层的节点。当遍历完一层节点后,我们就可以计算这一层的最大值,接着再移到下一层,重复这个过程,直到遍历完树的所有层。

代码实现

import java.util.*;

class TreeNode {
    int val;
    TreeNode left, right;

    TreeNode(int val) {
        this.val = val;
        this.left = this.right = null;
    }
}

public class MaxValuesInEachRow {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        
        if (root == null) {
            return result;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            int maxVal = Integer.MIN_VALUE;
            
            for (int i = 0; i < levelSize; i++) {
                TreeNode currentNode = queue.poll();
                
                // 更新当前层的最大值
                maxVal = Math.max(maxVal, currentNode.val);
                
                // 将子节点加入队列
                if (currentNode.left != null) {
                    queue.offer(currentNode.left);
                }
                if (currentNode.right != null) {
                    queue.offer(currentNode.right);
                }
            }

            // 当前层遍历完了,记录最大值
            result.add(maxVal);
        }

        return result;
    }

    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(3);
        root.right = new TreeNode(2);
        root.left.left = new TreeNode(5);
        root.left.right = new TreeNode(3);
        root.right.right = new TreeNode(9);

        MaxValuesInEachRow solution = new MaxValuesInEachRow();
        List<Integer> result = solution.largestValues(root);

        System.out.println(result);  // Output: [1, 3, 9]
    }
}

代码解读

首先我们创建了一个 TreeNode 类,它代表二叉树的节点。然后,我们的 largestValues 方法实现了层次遍历的过程。
  • 我们用 queue 来保存当前层的所有节点,每次从队列中取出一个节点,检查它的左右子节点,依次将它们加入队列。
  • 每次遍历一层,我们都记录该层的最大值,并将其添加到结果 result 中。
这里的重点是:我们在每一层遍历的时候,使用 Math.max() 来更新最大值。每层遍历结束后,将这个最大值存入 result

时间和空间复杂度分析

  • 时间复杂度:O(N),N 是树中的节点总数。每个节点只会被访问一次。
  • 空间复杂度:O(W),W 是树的最大宽度。在最坏的情况下,队列中会存储所有同一层的节点,空间复杂度是宽度的最大值。对于完全二叉树来说,最大宽度大约是 N/2。

代码的改进与优化

这道题目其实没有太多可以优化的地方,毕竟它的关键思想就是层次遍历,BFS 本身就能高效地解决这一问题。不过,还是可以做一些小小的优化,比如在遍历的时候,我们可以提前排除空节点的判断,防止不必要的队列操作。总之,这种基础的树形问题其实在实际工作中也是很常见的。

结语

说了这么多,看似简单的题目,其实背后也有不少技巧和细节。层次遍历是非常常见的树形问题解决思路,这种思想不仅仅局限于“找最大值”,也可以扩展到其他的很多场景。比如,某一层的平均值、某一层的节点数量等等。再者,广度优先的思想还可以运用到图的遍历中,使用队列进行层次遍历,也是图算法中非常经典的操作。
虽然我一直觉得树形结构在很多人眼里是“难度很大”的存在,但只要掌握了BFS这一套路,树就不再那么神秘了。所以,大家在做这些题目时,别觉得每次都是老生常谈的题目,多练习,灵活应用,不断改进自己的思维方式,必定能在面试中占得先机。
对编程、职场感兴趣的同学,可以链接我,微信:coder301 拉你进入“程序员交流群”。
🔥东哥私藏精品 热门推荐🔥

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

资料包含了《IDEA视频教程》《最全Java面试题库》、最全项目实战源码及视频》及《毕业设计系统源码》总量高达 650GB 。全部免费领取!全面满足各个阶段程序员的学习需求。

Java面试那些事儿
回复 java ,领取Java面试题。分享AI编程,Java教程,Java面试辅导,Java编程视频,Java下载,Java技术栈,AI工具,Java开源项目,Java简历模板,Java招聘,Java实战,Java面试经验,IDEA教程。
 最新文章