刚开始接触算法时,很多新手在打开刷题网站准备大展拳脚之际,往往会遇到第一个拦路虎:为什么刷题平台的代码结构和运行方式,与平时在本地编译器中大相径庭? 别担心,这其实是由于两者的设计初衷不同。今天这篇文章就来帮你理清差异,助你快速上手,丝滑刷题。
核心差异:只写逻辑 vs 从零构建
LeetCode 等刷题平台的设计理念是“剥离繁琐,专注核心”。系统已经在后台为你搭建好了运行环境,并自动传入测试用例。因此,它帮你屏蔽了以下步骤:
命令行交互(如 input() 和 print())
输入输出的数据类型转换与解析
文件读写等周边操作
这和你平时在编译器里新建一个 .py 脚本,从引包、读取输入到打印结果的全流程开发完全不同。在刷题网站上,你只需要扮演一个角色:核心算法函数的实现者。
1. 没有 main 函数,也没有 input() 和 print()
平时写代码: input() 读取用户输入,最后用 print() 把结果打印到控制台。
LeetCode 上:直接运行你写的那个方法,直接把测试用例当作参数传进去,然后检查你 return 回来的结果对不对。
| 本地编译器 | LeetCode |
|---|---|
需要 print(result) 才能看到输出 | 只需要 return result,系统自动接住结果进行比对 |
| 需要手动输入测试数据 | 系统自动传入封装好的测试用例 |
2. 最常遇到的坑:List 没定义
你注意看题目给的模板(举例:49.字母异位词分组):
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
这里用了 List[str] 这种类型注解。
在 LeetCode 网页上:后台默认帮你 from typing import List
在本地 IDE 复制粘贴运行:Python 不认识 List,会直接报错 NameError: name 'List' is not defined。
如果你要把代码复制到本地跑,必须在文件最上面加上一行 from typing import List。
3. 你不用管“怎么传参数”,只管“怎么写函数体”
平时写代码:考虑 input() 返回的是字符串,要用 split() 切分,还要转成 int,非常麻烦。
LeetCode 上:它把数据喂到你嘴边了。题目保证 strs 已经是一个现成的 List 列表,target 已经是现成的整数。你只需要专注写 for 循环和 if 判断,完全不用管数据是怎么来的。
针对现在这道题,给一个“能在本地跑”的模板
在leetcode的写法为
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
mp = collections.defaultdict(list)
for st in strs:
key = "".join(sorted(st))
mp[key].append(st)
return list(mp.values())
如果你想在本地编译器里复现 LeetCode 的效果,可以这样写(把测试代码补全):
# 导入类型注解工具
# 因为 Python 默认不认识 List[str] 这种写法,必须从 typing 模块里把 List 这个“类型名”导入进来,否则在本地运行会直接报错:NameError: name 'List' is not defined。
# 为了能在你自己的电脑(本地 IDE)上跑通,必须加上这行。
from typing import List
# 导入 collections 工具箱(这是针对这一题要导入的库)
# 我们要用里面的 defaultdict(智能字典),如果不导入,代码里的 collections.defaultdict 就无法识别。
import collections
# 定义 Solution 类
# LeetCode 规定所有解法必须写在 Solution 这个类里面,这是它的固定格式,不要改动类名。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
mp = collections.defaultdict(list)
for st in strs:
key = "".join(sorted(st))
mp[key].append(st)
return list(mp.values())
# ---------- 下面的代码是专门为“在你自己电脑上运行”准备的,LeetCode上不需要写! ----------
# Python 的“程序入口”标志
# 这行代码的意思是:只有当你在本地直接双击运行这个 .py 文件时,才会执行 if 里面的代码。
# 如果这个文件是被别的程序导入(import)的,这行里面的代码就不会执行。
# LeetCode 后台是直接调用我们上面定义的类,所以不会执行这里,因此这行在 LeetCode 上可以省略。
if __name__ == "__main__":
# 创建 Solution 类的实例对象
# 类只是一个“图纸”,要使用里面的方法,必须先 new 一个具体的“实物”(实例)。
sol = Solution()
# 手动构造 LeetCode 提供的测试用例
test_input = ["eat", "tea", "tan", "ate", "nat", "bat"]
# 调用我们刚才写好的分组方法
# 把测试数据传进去,接收返回的结果,存到 result 变量里。
result = sol.groupAnagrams(test_input)
# 在控制台打印最终结果
# 相当于 LeetCode 的“输出”区域
print(result)
LeetCode 只让你写“函数体内的核心逻辑”,它帮你去掉了
input、类型导入和main入口。你要做的,就是把 LeetCode 当成一个“填空题”,专注把return后面的东西算出来。

485

被折叠的 条评论
为什么被折叠?



