程序员老鬼

外包员工上班玩游戏,被当场辞退了。。

程序员的日常有时候真的让人啼笑皆非,比如最近看到一个帖子,说外包员工上班玩游戏被辞退了,这事真是让我忍不住感慨,胆子是真的大!

Image

事情是这样的,有位哥们儿边上班边在工位上拿着手机打游戏,结果领导刚好路过,直接当场开喷:“你工作量这么轻松吗?玩得这么嗨!”最后,毫不犹豫地把他辞了。

更离谱的是,这事直接影响了项目进度。项目本来已经够忙了,结果领导一句“都有时间玩游戏了,那就是工作量不够,不需要补人了”,团队人手从此少了一个,任务堆到大家头上,压得喘不过气。💀

其实吧,这种行为真是让整个团队背锅。很多外包员工本身就不容易,在项目中夹缝生存,被贴上“干得少,跑得快”的标签,现在这种操作无异于火上浇油。玩游戏倒不是不行,但分场合啊!

工作真的不易,建议大家别搞这些骚操作,毕竟饭碗是自己的,游戏再好玩,也不能玩丢了工作呀!【备注:文末可领最新资料】。

算法题:保持城市天际线

今天聊个有意思的算法问题:保持城市天际线。

题目是这样的:给你一个二维数组 grid,表示一个城市的建筑高度,grid[i][j] 代表第 i 行、第 j 列那个建筑的高度。现在让你调整这些建筑的高度,使得从左到右、从上到下看,城市的天际线(最高的轮廓线)保持不变,同时总的高度修改量最小。🧐

动脑时间

看懂题目后,先观察一下数据特点。所谓天际线,就是从行和列的两个维度来看,最高的那一排建筑。
你可以用两个数组来记录:

  • rowMax[i]:第 i 行的最高值
  • colMax[j]:第 j 列的最高值

根据题意,建筑调整后的高度 grid[i][j] 必须满足:
grid[i][j] ≤ min(rowMax[i], colMax[j])
这很好理解,毕竟一栋建筑被“夹”在行列的最高限制中,它只能长到这么高,不然就破坏天际线了。

接着,为了让修改量最小,我们尽可能让建筑往上“长”到这个高度。所以公式改为:

newHeight[i][j] = min(rowMax[i], colMax[j]);

最后,调整总量就是:

sum += newHeight[i][j] - grid[i][j];

来个代码

直接上Java实现:

public int maxIncreaseKeepingSkyline(int[][] grid) {
    int n = grid.length;
    int[] rowMax = new int[n];
    int[] colMax = new int[n];

    // 计算每行每列的最大值
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            rowMax[i] = Math.max(rowMax[i], grid[i][j]);
            colMax[j] = Math.max(colMax[j], grid[i][j]);
        }
    }

    // 计算调整后的高度差
    int sum = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            int newHeight = Math.min(rowMax[i], colMax[j]);
            sum += newHeight - grid[i][j];
        }
    }

    return sum;
}

细节分析

  1. 时间复杂度:这段代码的时间复杂度是 O(n²),因为我们遍历两次二维数组。即便是大矩阵,也挺高效了。
  2. 空间复杂度:额外的 rowMax 和 colMax 数组,空间复杂度是 O(n)。

这个算法其实有点像写代码的日常,优化方案老是被前端、后端、测试“三面夹击”。我们这些程序员,也得在天际线的压力下,“总量改动最小”,还能让大家满意。☕ 换个思路想想,虽然被“限制”住了,但也让你避免了一些设计过头的尴尬。正如这道题里,那些建筑虽然不能随便长,但天际线的美感反而被保护住了。

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

Image

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。