同事加班进了 ICU,人还没出院,公司就已经招了新人顶替。。

科技   2024-11-26 11:32   山西  

听到个扎心的事儿,一个网友说他同事因为加班过度直接进了ICU,人还没出院呢,公司就已经招了新人顶替。😨

看到这儿,我心颤了一下。想我们打工人,经常通宵加班赶项目,需求改来改去,压根儿停不下来。但现实告诉你:打工人只是一颗螺丝钉,你拧不动了,下一秒就有新的螺丝顶上。

说实话,我觉得这种拼命换来的结果,真不值!咱加班熬夜修Bug的时候,公司灯火通明,等你生病倒下,办公室也能“光速填坑”,完全不会因为少了谁就停摆。想想看,这种命都不要的努力,到底为了啥呢?


还是那句话:工作是工具,不是人生意义。老板的KPI再紧急,也比不上你的健康重要。活得久,才有更多时间当人生的“产品经理”!

算法:被围绕的区域

最近有朋友问了一个有趣的问题:“写个算法解决‘被围绕的区域’问题!”这让我想起面试的时候,总有那么几个经典的算法题在等着你掏肝掏肺去解答。

这道题属于典型的深度优先搜索(DFS)和广度优先搜索(BFS)的结合应用,说白了,就是考你对图的理解和操作能力。

题目大致是这样的:

给你一个二维的棋盘,包含 XO,你要把所有被 X 包围的 O 全部变成 X,但那些与边界相连的 O 可不算被包围。比如说:

输入:
X X X X
X O O X
X X O X
X O X X

输出:
X X X X
X X X X
X X X X
X O X X

怎么样,是不是有点意思?不过这背后可是满满的套路。

解题思路

这题一看就知道得先玩点“圈地运动”。要解决这个问题,可以先逆向思考:哪些 O 是不需要变的?很明显,那些跟边界连通的 O 不用变。于是我们的策略可以分为以下几步:

  1. **先找边界上的 O**,用 DFS 或 BFS 把所有与它们连通的 O 标记为特殊符号,比如 T
  2. 遍历整个棋盘
  • T 恢复成 O,因为它们是安全的。
  • 把剩下的 O 变成 X,因为它们是被包围的。

OK,咱们直接上代码,看看到底咋实现。

代码实现(Java)

public class SurroundedRegions {
    public void solve(char[][] board) {
        if (board == null || board.length == 0return;

        int rows = board.length;
        int cols = board[0].length;

        // Step 1: Mark all boundary-connected 'O' as 'T'
        for (int i = 0; i < rows; i++) {
            dfs(board, i, 0); // Left border
            dfs(board, i, cols - 1); // Right border
        }
        for (int j = 0; j < cols; j++) {
            dfs(board, 0, j); // Top border
            dfs(board, rows - 1, j); // Bottom border
        }

        // Step 2: Replace all 'O' with 'X' and 'T' back to 'O'
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (board[i][j] == 'O') {
                    board[i][j] = 'X';
                } else if (board[i][j] == 'T') {
                    board[i][j] = 'O';
                }
            }
        }
    }

    private void dfs(char[][] board, int i, int j) {
        if (i < 0 || j < 0 || i >= board.length || j >= board[0].length || board[i][j] != 'O') {
            return;
        }
        board[i][j] = 'T'// Mark as temporary
        dfs(board, i - 1, j); // Up
        dfs(board, i + 1, j); // Down
        dfs(board, i, j - 1); // Left
        dfs(board, i, j + 1); // Right
    }
}

一些有趣的点

  1. 为什么用 T
    T 是为了区分那些被标记的 O,这招就像是给自己下了个“伪装术”,最后再恢复,能避免一不小心把原来的 O 全部改掉了。

  2. DFS 和 BFS 的选择?
    老实说,这俩都行。DFS的代码写起来更“递归风”,BFS则更“队列味”,具体用哪个看你心情。记得面试官问你时就说:“我喜欢递归的艺术美感。”😏

  3. 为啥要先找边界?
    这是逆向思维的典范。边界上的 O 是整个棋盘中最不可能被包围的。先从这里下手,效率高还清晰。

大家还有其他有趣的算法题想聊吗?评论区见!

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

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

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

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