程序员老鬼

刚入职和组里外包骂起来了。。

刚看到个贴子说,程序员刚入职跟组里的外包直接杠上了😂。要代码不给,还被对方骂,最后俩人互骂,leader在旁边都看懵了。

Image

作为程序员,最怕的就是项目交接不清晰,代码不给就是不给你机会接手,典型的信息壁垒。网友们说外包不配合,甚至态度还极差,真的是见怪不怪了,很多老油子就喜欢拿“还没开发完”当挡箭牌,谁刚来都吃这个亏。

不过话说回来,互骂解决不了根本问题,毕竟在职场,leader更看重的是你能不能搞定事,而不是吵赢谁。从技术人角度讲,沟通和耐心比一时情绪重要,真遇到这种事,直接拉leader进群协同是最优解,千万别让自己背锅。【备注:文末可领最新资料】

算法题:无重叠区间

晚上快十二点了还没睡,准备关灯,结果突然有人在群里问,说他面试遇到个区间合并的题,还是那种“无重叠区间”怎么写...就纯纯没睡意了你知道吧,这种题我之前还真碰到过,当时脑子也不太清楚,差点给写错了。其实这个算法题啊,思路真的没多难,就是写起来有点细节容易飘,尤其是用Java写的时候。

我说你们有没有碰到过这种需求啊,比如说老板让你做一个行程管理啥的,每个人安排的会议啊之类的,假如一个人一天有好几个时间段,不能有重叠的嘛。那这题意思就是给你一堆区间,问你最多能选几个互不重叠的。你要是真用暴力遍历,肯定会超时...反正我面试那会直接懵了。

其实后来仔细想想,这个套路其实跟那个...贪心算法很像对吧。每次都挑最早结束的,为什么?你想啊,你把时间空出来,后面能放的区间就多嘛。其实就是“安排会议”那味儿。

代码一般这样搞:

  1. 先按每个区间的结束时间从小到大排个序。
  2. 然后用个变量记录下前一个区间的结束时间,遍历每个区间,开始时间大于等于上一个结束时间就能选进来。

你们先别喷哈,反正我一般这么写:

import java.util.Arrays;

publicclassNoOverlapIntervals{
publicinteraseOverlapIntervals(int[][] intervals){
if (intervals.length == 0) return0;
// 排序 结束时间最早的排前面
        Arrays.sort(intervals, (a, b) -> a[1] - b[1]);
int count = 1; // 第一个区间肯定选了
int end = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
// 当前区间的开始时间如果>=上一个的结束时间,说明不重叠
if (intervals[i][0] >= end) {
                count++;
                end = intervals[i][1];
            }
        }
// 其实题目问的是要去掉几个区间不重叠,所以返回 intervals.length - count
return intervals.length - count;
    }
}

你们想想啊,比如我周六那天去健身房,想安排几个不同的课程,不希望有重叠,最多安排几个?其实你就把每个课程时间段当成区间,一模一样的逻辑。

还有公司会议室预约也是,早上我们组那个小李老是把会议定得满满的,然后最后被人投诉说重叠了谁都进不去,后来我给他推荐就按结束时间排序,最多能排几个。

其实有时候我脑袋卡壳了还喜欢画个图,横着一条线,画几个区间,试试哪个能选,手点点比光想强多了。

其实最容易错的地方就是,区间的排序千万别写成按开始时间,不然你就会漏选。还有就是count初始要从1还是0,这种小细节,面试时一急真容易弄混。

对了还有个小插曲,前几天晚上十一点多的时候,我还跟我们隔壁组的大壮争论了一会儿,他非说可以用动态规划,其实也没错,但复杂度高多了,没啥必要。贪心效率高,代码简单。

-END-

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

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