程序员老鬼

发薪日发现多了7万块,以为财务发错了,第二天上班才知道,这是公司的利润奖,平均每人3W~5W不等。

刚看到个贴子,说有员工发薪那天查银行卡,突然多了7万,以为财务小姐姐手滑了,结果第二天才知道是公司发的利润奖,平均每人都有三到五万。

Image

我作为程序员,第一反应是:要是我们这行也能这样发,估计加班时心情能好一半。网友们的评论基本是羡慕+震惊,其实也能理解,毕竟多数公司发奖金都是打折版。

从技术人的角度看,这种“利润共享”的机制特别健康。写代码本质上就是在创造价值,如果最后的收益能跟员工挂钩,那大家自然更愿意投入。反过来,如果公司只是压榨劳动力,再高的情怀也会被磨没。

说到底,钱才是最硬的认可,比什么口号、团建都实在。希望更多公司能像这样,真心实意把成果分给员工,这样才能留住人、激励人。【备注:文末可领最新资料】

算法题:从两个数组中创建对象

昨晚十一点多,在公司楼下等奶茶,风呼啦啦的,小李在群里甩过来一句——“哥,两个数组能不能直接怼成对象啊?”我当时脑子一懵,嗯…这事儿别整花活,走最稳的路子就行,对吧。

就是那个…两个数组,一个放名字、一个放年龄,或者一个放id配名字,另一个放id配年龄。目标是搞出Person对象的列表。核心就两招:对位合并(zip)和按键合并(join)。前者长度对齐就行,后者得靠id对上号。等等我喝口奶茶…行,继续。

对位合并,干净利落

最常见的面试问法。两个数组等长,或者不等长就以短的为准,别越界。空值就跳过,别给自己挖NullPointerException的坑。

import java.util.*;

classPerson{
final String name;
finalint age;
    Person(String name, int age) { this.name = name; this.age = age; }
public String toString(){ return name + "(" + age + ")"; }
}

publicclassZipBuild{
publicstatic List<Person> fromArrays(String[] names, int[] ages){
if (names == null || ages == null) return Collections.emptyList();
int n = Math.min(names.length, ages.length);
        List<Person> res = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
            String nm = names[i];
// 名字判空,年龄用默认值兜底,看团队约定
if (nm != null && !nm.isEmpty()) {
                res.add(new Person(nm, ages[i]));
            }
        }
return res;
    }

// 小测一把
publicstaticvoidmain(String[] args){
        String[] names = {"张三", "李四", "王五"};
int[] ages = {18, 20, 0};
        System.out.println(fromArrays(names, ages)); // [张三(18), 李四(20), 王五(0)]
    }
}

这个复杂度就O(n),一遍走完,连鞋都没湿。边界上…数组长度不一致就以短为准;空数组直接空列表;名字为空的,自己决定是跳过还是塞占位对象,别到处风格不一致。

按键合并,像左连接那味儿

现实里更常见的是两个来源:A给id->name,B给id->age,乱序的。那就先把B丢进Map,再遍历A,能对上就创建对象,对不上就给默认值。有人问为啥不双层for…别啊,O(n*m)谁受得了,Map一把就O(n+m)。

import java.util.*;

classJoinBuild{
staticclassNameRow{ int id; String name; }
staticclassAgeRow{ int id; int age; }

publicstatic List<Person> joinById(NameRow[] names, AgeRow[] ages){
if (names == null || ages == null) return Collections.emptyList();
        Map<Integer, Integer> id2Age = new HashMap<>(ages.length * 2);
for (AgeRow r : ages) {
if (r != null) id2Age.put(r.id, r.age);
        }
        List<Person> res = new ArrayList<>();
for (NameRow r : names) {
if (r == null || r.name == null || r.name.isEmpty()) continue;
int age = id2Age.getOrDefault(r.id, -1); // -1表示缺失,看你们业务约定
            res.add(new Person(r.name, age));
        }
return res;
    }

publicstaticvoidmain(String[] args){
        NameRow a = new NameRow(); a.id=1; a.name="小A";
        NameRow b = new NameRow(); b.id=2; b.name="小B";
        AgeRow c = new AgeRow();  c.id=2; c.age=21;
        AgeRow d = new AgeRow();  d.id=3; d.age=30;
        System.out.println(joinById(new NameRow[]{a,b}, new AgeRow[]{c,d})); // [小A(-1), 小B(21)]
    }
}

注意两点,第一,Map里重复id怎么处理,后写覆盖前写还是保留第一条,提前说清楚;第二,缺失数据要么默认值,要么直接跳过,别让“半身不遂”的对象流进下游。

是不是感觉…也就这点事儿?对啊,别想复杂了。写法上能再抠就抠:预估ArrayList容量、避免装箱拆箱、判空集中放在入口,团队读起来才舒服。

-END-

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

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