在某为干了6年。公司里最考验人的是"奋斗者协议"。每年HR都会让你签一份自愿放弃年假、自愿接受加班的协议~
刚刷到这个,真给我看沉默了。
有网友说自己在某为干了6年,最难熬的不是项目,也不是加班,而是每年HR递过来的那张“奋斗者协议”。
名字听着挺热血,内容就很现实:年假可以不要,加班自愿接受。你签了,奖金、股票、晋升这些东西才可能多看你一眼。
不签也行,公司不会当场说你不奋斗,更不会直接给你穿小鞋。就是以后调薪没你,升职没你,好机会也总能绕开你。
最绝的是,这一切还得叫“自愿”。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)。
题目不难,真正值得记住的是三个地方:条件是“或”,边界包含等号,数值字段别随手选小类型。简单题最烦的不是不会写,而是看一眼觉得稳了,提交后才发现错在一个符号上。