年薪100多万,女朋友是大学同学,处了7年。丈母娘竟说,只要我考上当地的公务员,哪怕一个月2k也把女儿嫁给我
刚看到个贴子,说有位大厂P7程序员,年薪百万,女朋友是大学同学,处了七年,结果丈母娘一句话:只要考上公务员,哪怕月薪2k也愿意嫁女儿。😂
我觉得这事吧,本质是“安全感”之争。作为程序员,说句实话,哪怕你在大厂混得不错,年薪再高,在部分人眼里还真不如一个稳定的“铁饭碗”。网友们的回复我看了看,有的觉得丈母娘太功利,有的替程序员不值。但换个角度想,信息差是真实存在的。程序员这个职业,外人只看到高薪,没看到不稳定、加班、裁员的“暗流”,丈母娘那一辈天然就更信体制,觉得公务员起码不容易失业。
我的看法是,别太纠结谁对谁错,每个家庭择偶标准不同。程序员也别太玻璃心,毕竟“性价比”永远是职场和婚姻里的刚需。【备注:文末可领最新资料】
算法题:范围和相等的最宽索引对
快十一点了,办公室就剩我和小李,那货突然冒出来一句,哥你知道那个什么——“范围和相等的最宽索引对”这个题怎么做吗?我一开始脑子还懵着,啥玩意?听着就头大。后来仔细一想,这题其实蛮有意思,也不难,就是容易一上头搞晕。
场景大概是这样,给你一个整数数组,问你有多少对索引 (i, j),i < j,使得区间 [0, i-1] 的和等于 [j, n-1] 的和。要求你把跨度最大的这对给找出来。
你们别光听名字就跑,其实想想也简单,暴力当然能做,不过面试官要是让你O(n)你不就得想点骚操作了?
我记得我当时还拿张废纸随手画了下,整个过程其实就是——你要找到前缀和等于后缀和的那个点,然后跨度最大嘛,i要小,j要大,间隔要大,这不就很像那个,呃,双指针那种套路。反正我那会没睡醒,差点把小李的外卖吃了。
代码的话,我一般就先算个前缀和、后缀和啥的,数组里溜一圈。Java写起来就一两下的事,给你们随手糊一个出来哈:
publicclassMaxWidthEqualSum{
publicintmaxWidthBetweenSums(int[] nums){
int n = nums.length;
int[] prefix = newint[n + 1];
int[] suffix = newint[n + 1];
for (int i = 0; i < n; i++) prefix[i + 1] = prefix[i] + nums[i];
for (int i = n - 1; i >= 0; i--) suffix[i] = suffix[i + 1] + nums[i];
Map<Integer, Integer> leftMost = new HashMap<>();
Map<Integer, Integer> rightMost = new HashMap<>();
for (int i = 0; i <= n; i++) {
// 记录最早出现的前缀和
leftMost.putIfAbsent(prefix[i], i);
}
for (int i = n; i >= 0; i--) {
// 记录最晚出现的后缀和
rightMost.putIfAbsent(suffix[i], i);
}
int maxWidth = 0;
for (int sum : leftMost.keySet()) {
if (rightMost.containsKey(sum)) {
int l = leftMost.get(sum);
int r = rightMost.get(sum);
if (l < r) {
maxWidth = Math.max(maxWidth, r - l);
}
}
}
return maxWidth;
}
}
那会写的时候,我还一边在公司楼下抽烟一边琢磨这个逻辑,旁边阿姨还问我“孩子,你怎么还不回家”,我说我这不是在debug人生吗。
这题其实最怕你绕晕,别老想着啥花里胡哨的优化,场景一想就很清楚,最宽嘛,就是前缀和在左边出现最早,后缀和在右边出现最晚,对吧。所以哈希表就两遍遍历搞定了。记住得,前缀是从0到i,后缀是从j到n-1。
而且你要是面试碰上这个题,记住别一股脑直接上来就写for三层循环啊,会被喷的。面试官想看的就是你有没有那种“哈希表一遍带过”的意识,别在那卡着不动。
我跟你讲,小李后来写完直接发群里炫耀,还非要我帮他review,结果他一不小心写成了prefix[i] == suffix[j],还给我debug半天。你们说这小孩,活该被我嘲笑。
对了,这题你们要是遇上了啥坑,其实也就这几个:注意前缀和和后缀和的下标得对齐,别写错一位数;还有就是最宽那对要找最大差值,不是所有都算。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html