程序员老鬼

在某为干了6年。公司里最考验人的是"奋斗者协议"。每年HR都会让你签一份自愿放弃年假、自愿接受加班的协议~

刚刷到这个,真给我看沉默了。

有网友说自己在某为干了6年,最难熬的不是项目,也不是加班,而是每年HR递过来的那张“奋斗者协议”。

名字听着挺热血,内容就很现实:年假可以不要,加班自愿接受。你签了,奖金、股票、晋升这些东西才可能多看你一眼。

Image

不签也行,公司不会当场说你不奋斗,更不会直接给你穿小鞋。就是以后调薪没你,升职没你,好机会也总能绕开你。

最绝的是,这一切还得叫“自愿”。HR把纸往桌上一放,大家互相看一眼,谁敢真把自愿当自愿啊。

今日面试题

一道看着不用动脑,提交时却容易写错的题:大的国家

这题的判断条件只有两个:

面积至少为 3000000
或者
人口至少为 25000000

看到这里,代码基本已经写完一半了。但我做这种题,第一眼不会急着敲循环,而是先盯住条件里的“或者”。

不少错误就出在这里。题目要的是满足任意一个条件,不是两个条件必须同时满足。换成代码,应该用 ||,写成 && 以后,面积很大但人口不够的国家会直接被漏掉。

假设每个国家包含名称、人口和面积,我们先把数据结构收紧一点:

import java.util.ArrayList;
import java.util.List;

publicclassBigCountryFinder{

staticclassCountry{
        String name;
long population;
long area;

        Country(String name, long population, long area) {
this.name = name;
this.population = population;
this.area = area;
        }
    }

publicstatic List<Country> findBigCountries(List<Country> countries){
        List<Country> matched = new ArrayList<>();

for (Country country : countries) {
boolean largeArea = country.area >= 3_000_000L;
boolean largePopulation = country.population >= 25_000_000L;

if (largeArea || largePopulation) {
                matched.add(country);
            }
        }

return matched;
    }
}

我这里没有把两个数字直接塞进 if 里。拆成 largeArea 和 largePopulation,代码多了两行,但排查时舒服很多。以后门槛调整,或者产品突然要求把命中原因也返回,不用重新拆表达式。

还有一个细节,人口和面积用了 long。

当前题目的阈值放进 int 没问题,但国家人口、土地面积这类字段,本身就属于容易继续变大的业务数据。项目代码里为了省几个字节硬用 int,后面数据一扩展再改类型,反而更麻烦。

测试一下:

publicstaticvoidmain(String[] args){
    List<Country> countries = new ArrayList<>();
    countries.add(new Country("Northland", 18_000_000L, 3_200_000L));
    countries.add(new Country("Eastport", 31_000_000L, 820_000L));
    countries.add(new Country("Lakeview", 9_000_000L, 460_000L));

    List<Country> result = findBigCountries(countries);

for (Country country : result) {
        System.out.println(
                country.name + " | "
                        + country.population + " | "
                        + country.area
        );
    }
}

Northland 靠面积命中,Eastport 靠人口命中,Lakeview 两项都不够,不返回。

这里还要盯一下边界。题目写的是“至少”,所以面积正好等于 3000000、人口正好等于 25000000,都算符合条件。判断必须是 >=,不是 >。

整个程序只顺序扫描一次国家列表。假设共有 n 条数据,时间复杂度是 O(n);除去保存结果所占的空间,判断过程本身是 O(1)。

题目不难,真正值得记住的是三个地方:条件是“或”,边界包含等号,数值字段别随手选小类型。简单题最烦的不是不会写,而是看一眼觉得稳了,提交后才发现错在一个符号上。