为什么我用 C++/Java 而非 Python 写算法题
Zhongjun Qiu 元婴开发者

写算法题这件事,说到底是一场「思考」与「表达」的博弈。语言选对了,思路才能跟上;选错了,代码写得再快也是返工的命。

一个反直觉的观察

用过的语言不少: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 都是静态类型语言。这个特性在工程代码里可能是「繁琐」,但在算法题里是「刚需」。

  • intlongdouble 报错?不存在的,一眼就知道范围够不够。
  • 容器类型 ListSetMap,泛型一写,进去是什么、出来是什么,清清楚楚。
  • 函数签名定了,输入输出就定了,调用的时候基本不会传错。

这种「写的时候麻烦」带来的好处是——你不得不在动笔前就把数据结构想清楚

而算法题考的不就是「想清楚」吗?

真正的效率,是一次写对

有人可能会说:「我 Python 刷了几百道题,也没觉得有什么问题啊。」

这话不假。刷着玩、追求数量,那确实 Python 快。

但如果要追求质量、要打比赛、要追求「一次 AC」,静态语言的这种「约束感」其实是帮你过滤掉了大量低级错误。

写算法题和写业务代码的逻辑是反的:

  • 业务代码要快、要灵活、要快速试错,所以动态语言占优。
  • 算法题要稳、要清晰、要想清楚再动手,所以静态语言更合适。

写在最后

当然,这只是个人习惯。Python 大神多了去了,用 Python 虐场的大有人在。

只是如果你也有「写 Python 算法题总是修修补补」的感觉,不妨试试换 Java 或 C++ 写几天。

那些多敲的字母,本质上是「强制暂停」——让你在动手之前,先把脑子跑一遍。

这可能就是所谓的「慢即是快」吧。

 REWARD AUTHOR
 Comments
Comment plugin failed to load
Loading comment plugin