比裁员更让人憋屈的事出现了~
刚看到个程序员圈子的热帖,说裁员后,部门里月薪两万、三万的走了,剩下月薪一万多的全接了他们的活,开口要涨工资还被说“不懂事”😅。网友们吐槽说,比被裁更难受的,是被无声加码还不让喊。
这事在IT圈其实挺常见。现在公司都喜欢“做减法”,以为活给少数人就能省钱,但其实人压榨久了效率会直接崩。说白了,你让低薪干高薪的活,还反对人涨薪,真的是把人当服务器用,没事就无限加负载,结果还指望不卡机?🙄
网友有人建议“躺平”,也有人劝赶紧跑。我认同适度“保命式摸鱼”,但更关键是自己得算好性价比,别被洗脑PUA。说到底,职场核心还是自己的价值——既要提升能力,也要守住底线。
算法题:报告系统状态的连续日期
产品又在说他们那个日报系统又炸锅了,说什么状态统计没问题,就是连着几天的状态总是漏,数据不对。然后我心想,卧槽,这不就是那个经典算法题嘛——连续日期的统计。那会儿手上咖啡还没喝完,就在脑子里过了一遍这个思路。
先聊点废话啊,这种需求其实很常见,尤其什么打卡系统、考勤、日报、健康监控,统统都绕不开。比如一个用户每天有一条“上报”,你要能统计连续几天都没断,或者找出最长连续天数,甚至要按不同状态(比如“在线”“离线”)去统计。你说这个吧,表面上挺简单,但一旦涉及跨月、闰年,周末、节假日,立马恶心起来。
我那会儿手头正好有个Java的小项目在搞日报展示,也遇到过类似的需求。就先说说怎么用Java解决这个“连续上报日期”问题吧。
那天正好组里小李也问我,“东哥你说用户漏了一天怎么找?我SQL都写懵了”,其实Java代码更直观。一般你会拿到一堆上报记录,比如是List、List啥的,反正得先按日期排个序对吧,别一上来就想着高并发、Map优化啥的,先能跑通再说。
假设你手里拿到的就是一堆Date,已经排序了,比如用户在7月1日、2日、3日、5日上报了,4号断了,那你要能识别出来3天是连续的,5号又是新一段。这种时候老实说,用for循环真是最省心:
publicstatic List<List<LocalDate>> findContinuousRanges(List<LocalDate> dates) {
List<List<LocalDate>> result = new ArrayList<>();
if (dates == null || dates.size() == 0) return result;
List<LocalDate> current = new ArrayList<>();
current.add(dates.get(0));
for (int i = 1; i < dates.size(); i++) {
LocalDate prev = dates.get(i - 1);
LocalDate curr = dates.get(i);
if (prev.plusDays(1).equals(curr)) {
current.add(curr);
} else {
result.add(new ArrayList<>(current));
current.clear();
current.add(curr);
}
}
result.add(current);
return result;
}
你看这段代码吧,真没啥花活。核心就是用LocalDate,每次都判断前后是不是差一天,如果断了就把之前的连续段存下来。其实,业务场景如果要输出最长连续天数啥的,就多一步找最大长度的那一组呗。
别以为代码就这样结束了,真上线之后各种脏数据就来了。比如同一天上报多次、数据有缺失、乱序的,你最好一上来就去重再排序。还有就是,有时候产品说“要统计工作日连续”,那就得判断是不是周末、节假日,这时候要用到java.time.DayOfWeek再加个判断。
另外,我上次踩坑最大的是有些后端把日期用字符串存的,"2025-07-22"这种格式,如果直接字符串比大小就GG了,一定得转成LocalDate再搞,不然有你受的。
反正这玩意就是“排序+循环”,99%场景够用,真的有变态需求再搞点缓存、分片、并发优化,平时别想太复杂。你要是非要高大上一点,也可以用Stream流式操作,不过其实本质一样。
-END-
我为大家打造了一份RPA教程,完全免费:www.songshuhezi.com/rpa.html