刚看到个贴子,大意是:网友吐槽自己部门来了个博士同事,代码写得乱七八糟,业务一点不懂就直接上手,埋了一堆坑,效果一般般,却被领导当宝贝,人都麻了。

我觉得这事吧,先分开说。贴子说的是“学历光环压人”,这个确实存在,很多领导天然觉得博士=聪明=潜力股,哪怕短期产出一般,也愿意多给机会,顺便还能给团队撑门面。网友回帖我也看了,有的说“学历没用,全看能力”,有的说“没学历连被偏爱的机会都没有”。我比较认同后面那句——学历是硬通货,但真想在职场站稳脚跟,还是得落到“把活干好”上。
换个角度想,如果那个博士迟早会把能力和业务补起来,你现在就是在跟未来的强对手同场竞技。与其天天气得牙痒痒,不如研究下:领导到底在他身上看中了什么?自己能不能也补齐一块。
我先说结论啊,这题其实就是一句话——在一堆有广告的时间段里面,把“空档”找出来,再挑一个最长的。听起来很生活,对吧。
你下班回家,点开一个 60 分钟的剧集,结果平台特别热情,给你塞了一堆广告:
你心里想的是:我就想找一段尽量长的、完全没有广告的时间,边吃饭边看,中间别被打断。
如果用算法的说法就是:
T 分钟(比如 60)n 段广告,每段是一个区间 [start, end)别被“算法题”这三个字吓到了,思路很接地气,就三步:
举个简单过程(还是刚才那几个广告):
原始广告:
第一步,按开始时间排序以后其实顺序不变。
第二步,合并重叠的广告段:
所以最后广告区间变成:
第三步,找这些广告之间的空档:
于是没广告的区间是:[0,5]、[10,20]、[40,50]、[55,60] 最长的是 10 分钟,有两个:[10,20] 和 [40,50],怎么取随你,可以取第一个出现的。
整个过程的成本:
来,上 PHP 代码,变量名写得尽量看一眼就懂的那种。
<?php/** * 计算剧集中最长的一段没有广告的时间 * * @param int $length 剧集总时长,例如 60(分钟 / 秒都行,只要统一单位) * @param array $ads 广告区间列表,每项是 [start, end],半开区间 [start, end) * @return array ['start' => int, 'end' => int, 'duration' => int] */functionmaxNoAdSegment(int $length, array $ads): array{// 没有任何广告,整集都是无广告if (empty($ads)) {return ['start' => 0,'end' => $length,'duration' => $length, ]; }// 1. 按广告开始时间排序 usort($ads, function($a, $b){if ($a[0] === $b[0]) {return $a[1] <=> $b[1]; }return $a[0] <=> $b[0]; });// 2. 合并重叠或相邻的广告区间 $merged = []; $current = $ads[0];for ($i = 1; $i < count($ads); $i++) { $interval = $ads[$i];// 如果当前区间与前一个区间有重叠,或者首尾相接,就合并if ($interval[0] <= $current[1]) {// 结束时间取更大的那个 $current[1] = max($current[1], $interval[1]); } else {// 不重叠,先把之前的放进结果里,再更新 current $merged[] = $current; $current = $interval; } }// 别忘了把最后一个也放进去 $merged[] = $current;// 3. 在这些广告区间之间找“空档” $bestStart = 0; $bestEnd = 0; $bestDuration = 0;// 3.1 片头到第一个广告之间if ($merged[0][0] > 0) { $duration = $merged[0][0] - 0;if ($duration > $bestDuration) { $bestDuration = $duration; $bestStart = 0; $bestEnd = $merged[0][0]; } }// 3.2 相邻广告之间的空档for ($i = 1; $i < count($merged); $i++) { $prevEnd = $merged[$i - 1][1]; $curStart = $merged[$i][0];if ($curStart > $prevEnd) { $duration = $curStart - $prevEnd;if ($duration > $bestDuration) { $bestDuration = $duration; $bestStart = $prevEnd; $bestEnd = $curStart; } } }// 3.3 最后一个广告到结尾之间 $lastEnd = $merged[count($merged) - 1][1];if ($lastEnd < $length) { $duration = $length - $lastEnd;if ($duration > $bestDuration) { $bestDuration = $duration; $bestStart = $lastEnd; $bestEnd = $length; } }// 如果广告把整集都盖住了,那就没有无广告时间了if ($bestDuration <= 0) {return ['start' => 0,'end' => 0,'duration' => 0, ]; }return ['start' => $bestStart,'end' => $bestEnd,'duration' => $bestDuration, ];}// 小测一下$length = 60;$ads = [ [5, 10], [20, 30], [28, 40], [50, 55],];$result = maxNoAdSegment($length, $ads);var_dump($result);// 期望:start 10, end 20 或 start 40, end 50,duration 10这段代码直接丢到本地 PHP 跑一跑就知道结果是不是你预期的了。
我为大家打造了一份RPA教程,完全免费:www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《最全项目实战源码及视频》。总量高达650GB