程序员老鬼

升任小组长不到三个月,快被榨干了。。

刚看到有程序员吐槽:升任小组长不到三个月,大小事都来找他,感觉被榨干了。说实话,这种情况在技术团队真的是太常见了,特别是新晋小组长,简直成了“万能接口”😂。

Image

我觉得这事吧,关键不是你能力不行,而是职位一变,原来那些小bug、小需求、小尴尬都能砸过来。网友们说什么“谁让你能力强”,但其实更多时候只是因为谁都懒得多想一步,就直接甩锅给最容易响应的人了。

不过话说回来,做管理是门新课,刚开始都容易被“业务流量”淹没。该推的推一推,有些事可以教一遍,让团队慢慢学会分担。毕竟榨干了自己,团队也带不起来。程序员做管理,得学会用“代码复用”的思维管人,别啥都亲自上手。【备注:文末可领最新资料】

算法题:考试的最大困扰度

你们还记得上学的时候,考场发卷子,一堆题,每题有个“困扰度”,就有点像给你每道题打分,说你答这道题得多费劲。老师就喜欢出点变态的题型,让人抓狂。现在这题也是,给你N道题,选M道,想让你选出的这M道题,里面“最大困扰度”最小,啥意思?你不能全挑简单的,也不能全挑难的,要找一个区间,让你这M道题里,最难那道和最简单那道之间的差最小。

其实这不就是滑动窗口吗?说白了,就是你把这些困扰度排序,然后用个窗口去滑,看哪个区间长度为M的,最大值和最小值差最小。思路就这么点事。

Java怎么写?

我当时在纸上随便画了画,其实代码真没啥,直接上:

import java.util.Arrays;

publicclassMain{
publicstaticintminDifficulty(int[] arr, int m){
        Arrays.sort(arr);
int n = arr.length;
int min = Integer.MAX_VALUE;
for (int i = 0; i <= n - m; i++) {
int diff = arr[i + m - 1] - arr[i];
if (diff < min) {
                min = diff;
            }
        }
return min;
    }

publicstaticvoidmain(String[] args){
int[] arr = {9, 4, 9, 6, 1, 9, 5, 7};
int m = 3;
        System.out.println(minDifficulty(arr, m)); // 输出2
    }
}

其实代码没什么难度,就是注意下数组要排序。你窗口左端点i,右端点就是i+m-1,这一段里最大就是arr[i+m-1],最小就是arr[i],差一减就行。你每滑一次,看下是不是更小的困扰度,就这么简单。

我那天跟小李说完他还不太信,说会不会有更优的?我说哥,这题没有啥动态规划,你就直接滑动窗口呗,要不你还能咋地?除非出题人搞事情,给你限制条件,数组超大或者有奇怪的条件,不然就这。你要说性能,Arrays.sort其实也就nlogn,窗口一遍扫n次,整体复杂度就是O(nlogn)。你想再快也没啥花头。

其实有时候做题别老想着复杂,题本身没那么变态,咱们就别吓自己。最多就是边界条件小心点,什么m==n啥的,注意下数组越界。

还有人问能不能用优先队列?其实没必要,滑动窗口这种题,排序完直接扫是最优解法。除非你有啥在线动态数据流之类的,那就另说了。正常面试,老老实实用排序加循环就行,面试官其实就是想看你会不会窗口这套东西。

-END-

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

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