听到个扎心的事儿,一个网友说他同事因为加班过度直接进了ICU,人还没出院呢,公司就已经招了新人顶替。😨
看到这儿,我心颤了一下。想我们打工人,经常通宵加班赶项目,需求改来改去,压根儿停不下来。但现实告诉你:打工人只是一颗螺丝钉,你拧不动了,下一秒就有新的螺丝顶上。
说实话,我觉得这种拼命换来的结果,真不值!咱加班熬夜修Bug的时候,公司灯火通明,等你生病倒下,办公室也能“光速填坑”,完全不会因为少了谁就停摆。想想看,这种命都不要的努力,到底为了啥呢?
还是那句话:工作是工具,不是人生意义。老板的KPI再紧急,也比不上你的健康重要。活得久,才有更多时间当人生的“产品经理”!
算法题:被围绕的区域
最近有朋友问了一个有趣的问题:“写个算法解决‘被围绕的区域’问题!”这让我想起面试的时候,总有那么几个经典的算法题在等着你掏肝掏肺去解答。
这道题属于典型的深度优先搜索(DFS)和广度优先搜索(BFS)的结合应用,说白了,就是考你对图的理解和操作能力。
题目大致是这样的:
给你一个二维的棋盘,包含 X
和 O
,你要把所有被 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
不用变。于是我们的策略可以分为以下几步:
**先找边界上的 O
**,用 DFS 或 BFS 把所有与它们连通的O
标记为特殊符号,比如T
。遍历整个棋盘:
把 T
恢复成O
,因为它们是安全的。把剩下的 O
变成X
,因为它们是被包围的。
OK,咱们直接上代码,看看到底咋实现。
代码实现(Java)
public class SurroundedRegions {
public void solve(char[][] board) {
if (board == null || board.length == 0) return;
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
}
}
一些有趣的点
为什么用
T
?
用T
是为了区分那些被标记的O
,这招就像是给自己下了个“伪装术”,最后再恢复,能避免一不小心把原来的O
全部改掉了。DFS 和 BFS 的选择?
老实说,这俩都行。DFS的代码写起来更“递归风”,BFS则更“队列味”,具体用哪个看你心情。记得面试官问你时就说:“我喜欢递归的艺术美感。”😏为啥要先找边界?
这是逆向思维的典范。边界上的O
是整个棋盘中最不可能被包围的。先从这里下手,效率高还清晰。
大家还有其他有趣的算法题想聊吗?评论区见!
对编程、职场感兴趣的同学,可以链接我,微信:coder301 拉你进入“程序员交流群”。