程序员老鬼

程序员因为周末没接电话被白嫖厂打了A2绩效,直接躺平不干了。。

刚刷到个贴子,说有个程序员周末没接电话,就被白嫖厂直接打了个 A2 绩效,整个人瞬间心态崩了,干脆躺平不干了。😅

Image

我作为程序员,看了挺无语的。说实话,周末接电话这种要求,本来就不合理,你不给 oncall 补贴,却要把责任压在个人身上,这就是赤裸裸的“白嫖文化”。有网友说“职场就是要讲价值”,我认同,但价值不是无限透支,更不是免费随叫随到。🚫

换个角度讲,如果公司真把“随时响应”当 KPI,那就该配套机制,比如轮班制度、额外补偿,这才是合理的职场契约。但现在不少大厂打着“责任感”的旗号,实质是把锅甩给员工。🤷

所以我理解这位程序员选择躺平。代码可以加班写,bug 可以加班修,但心被掏空了,就很难再满血工作。【备注:文末可领最新资料】

算法题:数组归约运算

昨晚十一点多,我在公司楼下吹风,手机快没电了,还在群里跟小李扯:数组那点事儿啊,其实“归约”就像把一串数叠成一个数,别想太玄乎。你每次拿两个做一次小运算,结果再跟下一个碰一下,最后只剩一个。就这么个来回。 ~~

归约的核心是三个词:操作、顺序、初始值。操作一般是可结合的,比如加法、乘法、gcd 这种,好处是你怎么括号都不坏结果;顺序呢,写循环时从左到右最常见;初始值也别忽略,比如求和初始值是 0,求乘积是 1,求最小值可以用整型上限。数组空的时候,全靠这个初始值兜底,不然就 NPE 或者根本没法算。

我懒得每道题都重写一遍,所以通常抽一个泛用方法,传运算进去,想加就加,想 min 就 min。Java 里有 IntBinaryOperator,顺手。

import java.util.function.IntBinaryOperator;

publicclassReducer{
publicstaticintreduce(int[] a, int identity, IntBinaryOperator op){
int acc = identity;
for (int x : a) acc = op.applyAsInt(acc, x);
return acc;
    }

// 示例
publicstaticvoidmain(String[] args){
int[] arr = {3, 1, 4, 1, 5};

int sum = reduce(arr, 0, (l, r) -> l + r);
int prod = reduce(arr, 1, (l, r) -> l * r);
int mx = reduce(arr, Integer.MIN_VALUE, Math::max);
int gcd = reduce(arr, 0, Reducer::gcd);

        System.out.println(sum + "," + prod + "," + mx + "," + gcd);
    }

staticintgcd(int a, int b){
if (a == 0) return Math.abs(b);
if (b == 0) return Math.abs(a);
        a = Math.abs(a); b = Math.abs(b);
while (b != 0) { int t = a % b; a = b; b = t; }
return a;
    }
}

你看,这种写法像搭乐高,运算子一换,题型就跟着换。要注意两个坑:一是整型溢出,乘积很容易炸,实在不放心就用 long 或者先判断;二是初始值得选对,不然空数组会把你阴到。还有,运算如果不是结合的,比如减法,就别并行,结果可能变。

并行这事儿要不要上

我在电梯口等人的时候想了下,数组很大时并行归约能省时间,但前提是操作满足结合律,最好可交换。Java 8 以后有 Arrays.stream(a).parallel().reduce(identity, op),写起来省心,底层用分治把数组劈成段,各段先算出局部结果,再把局部合起来。要是你自己想手搓,也能用 ForkJoin 做个分治,阈值以下改顺序循环,超过就拆两半递归,思路一样。

竞赛题常见变体

有时候题目会让你做“分段归约”,比如每 k 个一组算一下;或者“前缀归约”,也叫扫描,输出每个位置的累计值。前缀这个就把 acc 每步存下来就行,顺带还能做子数组快速查询:有了前缀和,区间和就是两次相减,别被卡常。再高级点,线段树其实就是把“归约”固化在树上,节点存一段的合并结果,查询和更新都靠这个操作。

差不多就这样,我先去拿杯水。等会儿有人要是问那个接口名…哦对,IntBinaryOperator,别写成 BinaryIntOperator,我昨晚就写错了一次,尴尬。

-END-

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

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