程序员老鬼

职场最恶心的就是这种老员工,让他带新人的时候,重点,细节全部不说,结果转头就去找领导那嚼舌根,告你

带新人最恶心的,不是不会带,是故意只说一半。流程给你个大概,坑点、边界、谁来拍板,全憋着不讲。等你真按自己理解做了,他转头就去领导那边补刀:这人不行,问也问不明白,做也做不对,还不尊重前辈。

Image

这种人我一直不太看得上。你问,他摆臭脸;你不问,他又说你瞎干。表面是在“带新人”,其实是在守自己的位置。不是怕你学不会,是怕你学会太快,显得他那点经验没那么值钱。

说穿了,这不是能力问题,是人坏。拿信息差卡人,背后递话,逼新人自乱阵脚,最后自己装成“早就提醒过”的样子。职场里碰到这种老员工,早点识别,少交心,关键事情留痕,别让他一张嘴把锅全扣你头上。

算法题:大的国家

表里就 6 个字段,题目也只干一件事:把“大”的国家捞出来。

这种题我一般不愿意绕。条件都已经写脸上了:

  • 面积 area >= 3000000
  • 或者人口 population >= 25000000

满足一个就算大国家。注意这个“或”,别手一快写成了 &&,这题最容易错就错在这。

题目原始场景其实更像一条数据库筛选语句,但很多人一看到“国家、面积、人口”就下意识想复杂了,开始琢磨排序、遍历优化、甚至还想上什么高级数据结构。没必要。这个级别就是老老实实按条件过滤,谁满足谁进结果集。

先把题意翻成 Java 里的判断,其实就是这么点东西:

publicbooleanisBigCountry(int area, int population){
return area >= 3_000_000 || population >= 25_000_000;
}

就这一行,基本已经把核心做完了。

不过既然题目说的是查出 name、population、area,那我们用 Java 写的时候,可以顺手把数据结构也带上。别整太花,够用就行:

classCountry{
    String name;
int population;
int area;

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

然后就是遍历筛选。这个过程没什么玄学,就是把满足条件的国家塞进结果里:

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

publicclassBigCountryFilter{

public List<Country> filter(List<Country> countries){
        List<Country> ans = new ArrayList<>();
for (Country c : countries) {
if (c.area >= 3_000_000 || c.population >= 25_000_000) {
                ans.add(c);
            }
        }
return ans;
    }
}

这段代码看着普通,但拿来做题是够稳的。现场写题,越是这种简单过滤,越别写飘。很多人容易在简单题上翻车,不是不会,是写太快,脑子里想的是“面积或者人口”,手上敲出来的是:

if (c.area >= 3_000_000 && c.population >= 25_000_000)

这就把“满足一个条件即可”写成了“两个都得满足”,结果直接少数据。

再说一下这题为什么算简单题。

它没有状态转移,不涉及回溯,也没有双指针窗口,更不存在什么贪心策略。说白了,就是一趟扫描。给你 n 条国家数据,你从头扫到尾,每条做一次条件判断,所以时间复杂度是 O(n),额外空间主要看结果集,通常记作 O(k),k 是最终符合条件的国家数。

这个复杂度基本已经到底了。因为你总得把每个国家看一遍,不看就不知道它是不是大国家。

再补一个更贴近笔试一点的完整写法,带测试数据,方便你直接拿去改:

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

classCountry{
    String name;
int population;
int area;

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

publicclassMain{

publicstatic List<Country> bigCountries(List<Country> countries){
        List<Country> result = new ArrayList<>();
for (Country country : countries) {
if (country.area >= 3_000_000 || country.population >= 25_000_000) {
                result.add(country);
            }
        }
return result;
    }

publicstaticvoidmain(String[] args){
        List<Country> countries = new ArrayList<>();
        countries.add(new Country("China", 1400000000, 9600000));
        countries.add(new Country("India", 1360000000, 3287000));
        countries.add(new Country("Iceland", 366000, 103000));

        List<Country> ans = bigCountries(countries);
for (Country c : ans) {
            System.out.println(c.name + " " + c.population + " " + c.area);
        }
    }
}

跑出来像 China、India 这种都会进结果,Iceland 这种明显不够条件的就不会进。

这题真正该记住的,不是代码有多难,而是这种题型的处理顺序:先把业务条件翻成布尔表达式,再决定遍历和输出。别一上来就写循环,循环只是壳,条件才是魂。条件没捋顺,后面写得再快也白搭。

“大的国家”这题,拿分点就两个字:别错。条件写准,遍历写稳,这题就过去了。