很多同学刚开始刷题,一看题目就懵。心里想,这题我连思路都没有,别人怎么就能写出来。我教编程这些年,见过太多学生卡在算法上。不是你们笨,是方法错了。
我带过一个学生,叫小刘。他大二开始刷LeetCode,刷了三个月,每天两题。结果呢?连最简单的二叉树遍历都写不利索。他来找我,说他很绝望。我看了一下他的刷题记录,发现他今天做链表,明天做动态规划,后天做字符串。我告诉他,你这样刷,刷一年都没用。
算法学习的关键不是题量,而是分类。就像学游泳,你今天学蛙泳,明天学自由泳,后天学仰泳,最后可能哪个都没学会。你得先把一种泳姿练透,形成肌肉记忆。刷算法题也一样。
我让他换了一种方法。把LeetCode上的题目按照数据结构分类。第一周只做数组相关的题。从最简单的移除元素开始,到两数之和,再到三数之和。每天做三道,做完了看别人的解法,总结规律。第二周做链表,从反转链表到环形链表,一步步来。一个月后,他跟我说,老师,我觉得算法题没那么恐怖了。
推荐一套适合Python初学者的分类刷题顺序。这套顺序是我从教学实践中总结出来的,你现在就能照着做。
第一阶段,数组和字符串。这是基础中的基础。别小看数组题,很多复杂算法的基础都是数组操作。比如二分查找,滑动窗口,都是高频考点。Python里列表操作很灵活,你多做几道,就能找到感觉。建议刷10到15道,把每种套路都摸清。
第二阶段,链表和哈希表。链表题主要考察指针操作。你别怕,Python里没有指针的概念,你只需要理解引用。哈希表题更简单,Python的字典就是现成的工具。这两类题加起来刷20道,基本就通关了。
第三阶段,栈和队列。Python里用列表模拟栈,用collections.deque模拟队列。这部分题不多,但很实用。比如括号匹配,就是栈的经典应用。建议刷10道,重点理解先进后出和后进先出的思想。
第四阶段,二叉树。这是很多人的噩梦。别急,你先掌握三种遍历方式。前序中序后序,先用递归写,再尝试迭代写法。刷上15道二叉树题,你会发现规律惊人的一致。碰到树题,先考虑递归,这是Python的优势。
第五阶段,动态规划。这个阶段放在最后。你先把前面的基础打牢,再来啃硬骨头。动态规划也有套路,比如背包问题,最长子序列。你先从最简单的斐波那契数列开始,逐步增加难度。刷10道经典题目就够了。
我那个学生小刘,按照这个顺序,用了三个月,刷了大概120道题。后来去面试,面试官出了一道中等难度的题,他十分钟就写出了完整解法。面试官问他怎么练的,他说就一句话:分类刷,重复练,量变引起质变。
很多人问,刷多少题才能有质变。我的经验是,每种类型刷到20到30道,你闭上眼睛都能写出模板,那就是质变。不用追求数量,追求的是熟练度。你刷300道乱七八糟的题,不如刷100道有规律分类的题。
最后说一点,别跟别人比。有人刷了50道就能出道,有人刷了200道还在入门。这很正常。每个人的基础和思维方式不同。你只需要每天进步一点点。今天比昨天多理解一种解法,就是胜利。把刷题当成锻炼,而不是考试。
拿Python刷题还有一个好处。Python的语法简洁,你不需要花太多时间在语言细节上。你只需要关注算法本身。这就好比给你一把好刀,你只需要琢磨怎么切菜。用C++刷题,你还要分心处理内存问题,用Java还要注意类型转换。Python把这些都省了。
我把这套分类方法整理成了PDF,里面包含100道经典题目的分类和解题思路。需要的同学可以私信我。别嫌麻烦,一步一步来。你会看到自己的变化。