写算法题这件事,说到底是一场「思考」与「表达」的博弈。语言选对了,思路才能跟上;选错了,代码写得再快也是返工的命。
一个反直觉的观察
用过的语言不少:C++、Java、C#、Python、JavaScript、TypeScript 都写过算法题。时间久了,发现一个有意思的现象——写算法题这件事上,C++ 和 Java 的体验反而比 Python 更好。
不是说 Python 不好,它写业务代码是真的快。但算法题和业务代码不一样,它需要你花大量时间在「想」上,而不是「敲」上。
多出来的那些字母,恰好是思考的时间
举个小例子。
用 Java 声明一个整数列表,你会写下:
1 | List<Integer> nums = new ArrayList<>(); |
这一行敲下来,脑袋里已经转了好几圈:接下来要遍历、要判断、这个列表要装什么类型的元素、需不需要去重——思路基本定型了。
换成 Python 呢?
1 | nums = [] |
六个字符,敲完不到一秒。手指停下来了,脑子还没跟上。于是稀里糊涂继续写下一行,代码逻辑七零八落,写到一半发现根本走不通。
类似的对比还有很多:
| 语言 | 声明一个空数组 |
|---|---|
| Java | int[] nums = new int[n]; |
| C++ | vector<int> nums(n); |
| Python | nums = [] |
| JavaScript | let nums = [] |
Python 是省事了,但省下来的不是时间,是思考的机会。
代码写得越快,返工越频繁
这才是核心问题。
Python 写算法题,前半段确实爽。变量不用声明类型,数组随手就是
[ ],一行代码顶 Java 五行。但爽过之后呢?
写着写着发现:
- 这个变量到底是 int 还是 long?跑的时候溢出了。
- 哪个函数返回了 None?我没判空。
- 这段逻辑绕来绕去,回调套回调,自己都看不懂了。
然后开始疯狂 debug、打印、删代码、重写。一道 medium 硬生生做了一个小时,其中四十分钟在修自己挖的坑。
反观 Java,类型写在脸上,IDE 报红报得比谁都快。写的时候慢是慢,但写完基本就是对的。
静态类型的「强制思考」
C++ 和 Java 都是静态类型语言。这个特性在工程代码里可能是「繁琐」,但在算法题里是「刚需」。
int、long、double报错?不存在的,一眼就知道范围够不够。- 容器类型
List、Set、Map,泛型一写,进去是什么、出来是什么,清清楚楚。 - 函数签名定了,输入输出就定了,调用的时候基本不会传错。
这种「写的时候麻烦」带来的好处是——你不得不在动笔前就把数据结构想清楚。
而算法题考的不就是「想清楚」吗?
真正的效率,是一次写对
有人可能会说:「我 Python 刷了几百道题,也没觉得有什么问题啊。」
这话不假。刷着玩、追求数量,那确实 Python 快。
但如果要追求质量、要打比赛、要追求「一次 AC」,静态语言的这种「约束感」其实是帮你过滤掉了大量低级错误。
写算法题和写业务代码的逻辑是反的:
- 业务代码要快、要灵活、要快速试错,所以动态语言占优。
- 算法题要稳、要清晰、要想清楚再动手,所以静态语言更合适。
写在最后
当然,这只是个人习惯。Python 大神多了去了,用 Python 虐场的大有人在。
只是如果你也有「写 Python 算法题总是修修补补」的感觉,不妨试试换 Java 或 C++ 写几天。
那些多敲的字母,本质上是「强制暂停」——让你在动手之前,先把脑子跑一遍。
这可能就是所谓的「慢即是快」吧。