程序员老鬼

坐标上海,月薪4万+,税后3万+,活的还是像一条狗,每天都是两点一线,无休止的加班,还担心被裁~

刚刷到个贴子,说在上海月薪4万+,税后3万+,结果生活状态还是像条狗,每天两点一线,加班无休,还担心哪天被裁,社交娱乐几乎为零。

Image

我作为程序员看这个话题,真的挺有共鸣的。程序员这行就是典型的“高薪=高压”,工资看起来光鲜,但背后是无数个深夜的Bug、版本迭代和随时可能掉线的心态。网友有人说“那就辞职去找轻松的”,可问题是,轻松的工作往往伴随更低的薪水,尤其在大城市,房租、房贷像个死循环,你不敢松手。

换个角度想,既然工作占了大部分时间,那唯一能做的是提升自己的“性价比”——既要守住技术护城河,也要学会适当摆烂,留点精力给生活。钱是重要,但人不能完全被工作吞噬。

总的来说,努力工作没错,但也别忘了给自己留一口喘息的空间,机器还能宕机,何况人呢。【备注:文末可领最新资料】

算法题:寻找峰值

昨晚十一点多我在公司楼下吹风,手机快没电了,小李还在群里问“哥,那个找峰值的题咋写”。我靠这不就是“数组里找一个比两边都大的数”,名字叫“寻找峰值”,你们肯定见过。先说人话结论:只要有一个地方往上再往下,那儿就能卡到峰;而且哪怕全程一直上升或下降,边上也算峰。

给你一个整型数组 nums,找任意一个峰值下标。峰值的定义是 nums[i] 大于相邻元素。边界想象成负无穷,所以第一个如果比第二个大,它也算;最后一个同理。最笨的扫一遍,看哪儿出现“上升转下降”。但我当时正困得眼睛酸,想快点:这题其实可以用二分,别害怕,逻辑挺顺的。

为什么二分可行

想象我们看中间 mid 和右边 mid+1 的关系。要是 nums[mid] < nums[mid+1],说明右边在上坡,峰一定在右侧某处(可能就在 mid+1 或更远);反过来如果 nums[mid] > nums[mid+1],说明我们已经开始下坡了,那左侧包含峰(可能就是 mid)。这就像你走山路,脚下往右更高,那就朝右爬;脚下往右更低,回头左边肯定还能蹿到一个高点。每次都把区间砍半,复杂度 O(log n),很舒服。

数组长度为 1,直接 0。长度大于 1 时,比较 mid 和 mid+1 足够了,不用管 mid-1,因为“单调+转折必有峰”保证了安全。还有个坑:不要越界,mid+1 一定合法,所以用左闭右闭写法更稳。

下面给一份 Java 代码,我刚才把变量名写得直白点,别折腾:

publicclassPeakFinder{
publicintfindPeakElement(int[] nums){
int n = nums.length;
if (n == 1) return0;
int left = 0, right = n - 1;
while (left < right) {
int mid = left + (right - left) / 2; // 防溢出
if (nums[mid] < nums[mid + 1]) {
// 右侧是上坡,峰在右边
                left = mid + 1;
            } else {
// 右侧是下坡或平台下降,峰在左边(含mid)
                right = mid;
            }
        }
// left==right 收敛到某个峰值位置
return left;
    }

// 可选:线性版,思路直觉但O(n)
publicintfindPeakElementLinear(int[] nums){
int n = nums.length;
if (n == 1) return0;
for (int i = 0; i < n - 1; i++) {
if (nums[i] > nums[i + 1]) return i;
        }
return n - 1; // 全程上升,最后一个是峰
    }
}

你看,循环条件是 left < right,每趟都至少丢掉一半;收敛时 left==right,就是答案。至于“平台”这种事,这题通常不设相等当峰(严格大于),所以 mid 和 mid+1 相等会落到 else 分支,右边界左移,仍旧收敛到某个局部高点。昨晚我测试了两把:比如 [1,2,3,1],第一轮 mid 在 1 位置,2<3 走右边,最后收在 2;再比如 [5,4,3,2],一直走左边,收在 0。

-END-

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

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