程序员老鬼

00后员工给我发“CNM”,这是被骂了??

刚刷到个贴子,一个管理层吐槽说下属给他发“CNM”,质问大家这是不是在骂人。结果00后员工解释说是“纯牛马”。。

Image

我看这事儿吧,感觉属实离谱但也不意外。现在不少00后上班像在打副本,发语音像弹幕,领导在他们眼里不是上司,是NPC,夸你两句纯属调侃。但反过来看,能出现这种沟通混乱,管理也难辞其咎。

网友有的觉得00后太离谱,有的觉得领导玻璃心。其实这事反映的是职场语言越来越“二次元”了,但别忘了,工作不是直播间,基本的尊重还是要有。

好好说话,才能好好上班。【备注:文末可领最新资料】

算法题:连续递增交易

昨天晚上啊,正好在便利店排队的时候刷了个题,嗯...就是那个连续递增交易的题。结果等结账的工夫脑子里就开始转了,你说这不就是一道带点“滑动窗口”的味儿的子数组问题嘛,对吧,贼常见那种——但这题有点意思,它不是让你找最大值,而是...找所有的合法子区间。

先说一下题目大概意思啊,它其实就是给你一串股票交易记录,比如价格吧:[1,2,3,2,3],然后问你这里面有多少个连续的子区间,是单调递增的。注意哦,是连续的!而且递增就行,不要求严格递增,比如 [2,2] 也不算递增,对吧?

我当时看了这题第一个反应就是:得扫一遍数组,然后找那种一段一段的“上坡路”。举个例子吧,比如你遇到 [1,2,3],对吧,那这3个数中,所有长度 ≥2 的子数组,都是递增的。就你从 1 到 2 是一个,从 1 到 3 是一个,从 2 到 3 又是一个,对吧?所以总数是:长度为 n 的一段递增区间,它能贡献 (n - 1) + (n - 2) + ... + 1 个递增子区间,嗯,其实是个等差数列求和,直接就是 (n - 1) * n / 2。

那逻辑就出来了啊,我们就扫一遍,然后维护一个当前递增段的长度就行了,每次遇到下降或平的地方,就结算一下那段“上坡”的长度,累加结果。挺简单的,核心其实就是这两句话:

if (prices[i] > prices[i - 1]) {
    count++;
} else {
    total += count * (count + 1) / 2;
    count = 0;
}

我随手撸了一个 Java 版本的,你们看是不是也觉得有点亲切:

publicclassIncreasingTrades{
publicstaticintcountIncreasingTrades(int[] prices){
int total = 0;
int count = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) {
                count++;
            } else {
                total += count * (count + 1) / 2;
                count = 0;
            }
        }
// 最后一段如果是递增的话别忘了加
        total += count * (count + 1) / 2;
return total;
    }

publicstaticvoidmain(String[] args){
int[] prices = {1, 2, 3, 2, 3};
        System.out.println("连续递增交易次数: " + countIncreasingTrades(prices));
    }
}

这个其实就是一个 O(n) 的做法,嗯,也没用啥复杂的数据结构,全程就是遍历加计数,我觉得你要是面试的时候遇到,直接写这个思路+代码,基本稳了。

就这题你千万别脑抽想着用双指针硬撸,那就有点...太折腾自己了。它不是问最大长度也不是问个别位置,它问你“总共有多少段递增交易”,所以就是把所有递增区间都要识别出来并算清楚它能贡献的个数——这个一不留神真容易漏。

而且我看有些人爱用 TreeMap 来搞,其实完全没必要。一个变量就够了,越想越多反而跑偏。

唉对了,说到这我突然想起来,昨天那个同事还拿这题来问我说能不能做优化,说什么能不能提前剪枝啥的...我说你就老老实实把问题搞清楚再说优化行不?这题已经是线性的了,优化啥啊兄弟,等你数据量到几个亿的时候再考虑吧...唉我先去热个牛奶,回来接着给他讲。

-END-

我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404