程序员老鬼

“笛子”员工硬刚领导下班时间安排会议,被隔壁组长移出群聊!

刚刷到个瓜,说“笛子”员工因为下班被安排会议,直接硬刚领导,结果被隔壁组长踢出群聊。
我觉得这事吧,表面上看是年轻人整顿职场,实际是代际观念在碰撞。网友们的回帖有支持有反对,有的说“职场不能太刚”,也有的觉得“不刚就一直被压榨”。 我的看法是,适度抗争是对的,但方式也很重要。纯刚到底有可能失去团队机会,但一味忍让就像死循环Bug,永远出不来。对了,职场毕竟是团队项目,遇事别忘了多沟通,别把自己踢出局。 总的来说还是要争取自己的权益,但别为了意气之争断了自己的路。 【备注:文末可领最新资料】

算法题:最长团队传球连击

哎,昨天晚上加班,回到刚躺下我们组那个小李就给我发微信,说有个Java算法题卡住了,问我“哥你知道最长团队传球连击怎么写不?”我看他那口气就是在项目现场被怼了——你们有没有遇到过那种写业务写吐了,突然来一道算法题让你脑袋卡壳的情况,反正我是经常被迫切回忆当年刷LeetCode的时光... 先说说这个题大概啥意思哈。就有点像那种打球传球那种感觉,一堆人排成一列,每个人只能把球传给自己右边比自己高的人,然后问你最多能连续传几下。你别小看这题,其实就是找 最长上升子序列 ,只是披了个“团队传球”的壳子。 那天我在公司茶水间等咖啡的时候,想了一下——其实用Java写这个事儿真没多难,不过有点细节容易踩坑。思路其实很简单,就是DP动态规划,最基础那个方法,没啥高大上的花头,但能过。

代码细节&场景碎碎念

你比如说我们假设有一组数组,表示每个人的身高:
int[] heights = {160, 170, 165, 180, 175, 190};
然后我每次写题,都喜欢边debug边说脏话...额,不小心暴露了... 那咱们的核心思路其实就是:遍历每一个人,然后看他之前所有人,有没有比他矮的,如果有,咱们就看之前这个人最多能连击几次,加一,取最大。用一个 dp 数组来存每个人为结尾时的最长连击。 你别问我为啥不优化成二分法啥的,项目里用动态规划已经很仁慈了,真遇到超长数组,再考虑优化。 咖啡喝完回来,代码就像这样:
public int longestPass(int[] heights) {
    if (heights == null || heights.length == 0) return0;
    int n = heights.length;
    int[] dp = newint[n];
    Arrays.fill(dp, 1);
    int maxLen = 1;
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (heights[i] > heights[j]) {
                dp[i] = Math.max(dp[i], dp[j] + 1);
            }
        }
        maxLen = Math.max(maxLen, dp[i]);
    }
    return maxLen;
}
你看代码其实没啥花头,就是两层for循环,O(n^2)嘛。 dp[i] 表示第i个人为终点,能传球的最长次数。每个人都往前看,只要有比自己矮的,就接着dp一下,取最大值。 实际跑一下,比如上面那组,最长能连击4次:160->170->180->190。像极了我们小组每次写方案,起点总是那个最弱的,到最后是大佬接力。 还有一点,顺便提醒一下——如果你真遇到海量数据,这种O(n^2)肯定不行,到时候可以考虑用一个辅助数组加二分查找优化到O(nlogn),不过面试官一般问到这种传球,直接DP就够用了。 对了对了,代码里你要注意空数组、全是一样高这种边界情况,别老忘了,现场面试最容易在这些地方翻车。 总之,最长团队传球连击这个算法题,其实就是换皮的最长上升子序列,别被名字吓到,生活里想想组里谁传活最溜,写代码的时候多模拟下场景,你下次遇到也能秒答出来。 -END -
我为大家打造了一份RPA教程, 完全免费: https://www.songshuhezi.com/rpa.html 最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链 接我领取,微信: hls404