上班狗,目的主要有两个。一个是以后如果换工作,面试可能会有加分。另外就是有些兴趣啦。
刷 LeetCode 的大局观
目前主流的刷题流派有两种,一种【龟系】,一种【兔系】。
“龟系”刷法的精髓就是每个题目都做干净。不满足于一种解法,各种解法都写一写。这种流派适合不太急于准备算法面试的小伙伴,追求算法的干净优雅。
“兔系”刷法的精髓是暴力,按照标签来刷,使用固定套路来刷。比如小吴之前分析的那道拍案叫绝的算法题,如果告诉你是标签是异或,你马上能 AC 。这都是套路。
每个标签内部可以按照 Easy 、Medium、Hard 的顺序做,算法练习是一个系统工程,不要一开始就追求难题,先熟悉熟悉套路,循序渐进的去做,后面所谓的难题也就不在话下。
建议小伙伴第一遍刷题可以使用 【兔系】 法。
看懂题目
万事开头难,看懂题目是做好一道算法题最开始也是最重要的一步。
我将 LeetCode 上的题大致分为三种类型:
•考察数据结构,比如链表、栈、队列、哈希表、图、Trie、二叉树等
•考察基础算法,比如深度优先、广度优先、二分查找、递归等
•考察基本算法思想:递归、分治、回溯搜索、贪心、动态规划等
一些算法题目会在标题或题目描述中给出明确的题目类型信息,比如二叉树的重建、链表的反转。
而有一些题目中则在条件中给予暗示 :
•设计一个 O(nlogn) 的算法(分治:在一颗搜索树中完成任务,对于数据排序)
•给定一个有序数组(二分法)
•无需考虑额外的空间(用空间换时间上的优化)
•数据规模大概是 10000(O(n^2)就可以)
•问题可以被递归解决(动态规划)
无论怎样,当你拿到一道算法题的时候,希望你能先去弄明白这道题目要考察的是什么,是简单的数据结构还是复杂的算法思想。
先去理清题目背后解法要用的技术,这样,这道算法题目才有做下去的可能。
不要忽视暴力解法
一般来说,BAT 等大厂的算法面试题基本上都是 Medium 级别及以下,并希望面试者能在 20 分钟以内给出一个「相对正确」的回答。
为什么说是 相对正确 ?
每一道算法题得解法都有很多种,并不是说你没有给出完美解或者最优解你就是错的。
“正确” 本身是一个相对概念。
在算法面试或者平时的算法练习时,如果没有头绪,可以尝试使用暴力解法。
(不要忽视暴力解法。暴力解法通常是思考的起点。)
当你使用了暴力解法之后,可以与面试官进行沟通优化,把这个过程看作是和面试官一起探讨一个问题的解决方案的过程,这也可以让面试官了解你的思考问题的方式。这也是一个“正确”的回答方式。
先实现功能再去优化。
Done is better than perfect 。
实际编写
到这一步就是算法的落地了:将上面的思考结果思路转换为代码。
在编写的过程中需要注意题目中的边界条件,比如数组是否为空,指针是否为 NULL;同时也要注意代码的规范性:变量名,模块化,复用性。
做好总结
一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。
在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。经过总结,这样题目才会变成你在此问题域中的积累。
做好总结,让每道题都有最大的收获。一个月之后自己的状态应该会有很大变化。[1]
最后,承认刷 LeetCode 很吃力很正常
你我都是普通的程序员,不像那些玩 ACM,拳打 LeetCode,脚踩剑指 offer,我们得接受现实:刷题,就是很痛苦很打击的过程。
但,一遍一遍的刷,多刷一题就多掌握一题,你总会比别人更强一点。
大家一起加油:)
有个程序员同事最近总是做leetcode习题,还看一些基础的知识,说明什么?
说明他想跑路了。
刷leetcode吃力正常吗?
c++ primer plus过了一遍,今天做了leetcode前几题,感觉有点吃力。
为了避免头条用户觉得我的回答装逼,先贴一下自己的 GitHub 地址,目前 20 k star。
https://github.com/MisterBooo/LeetCodeAnimation
刷 LeetCode 的大局观
目前主流的刷题流派有两种,一种【龟系】,一种【兔系】。
“龟系”刷法的精髓就是每个题目都做干净。不满足于一种解法,各种解法都写一写。这种流派适合不太急于准备算法面试的小伙伴,追求算法的干净优雅。
“兔系”刷法的精髓是暴力,按照标签来刷,使用固定套路来刷。比如小吴之前分析的那道拍案叫绝的算法题,如果告诉你是标签是异或,你马上能 AC 。这都是套路。
每个标签内部可以按照 Easy 、Medium、Hard 的顺序做,算法练习是一个系统工程,不要一开始就追求难题,先熟悉熟悉套路,循序渐进的去做,后面所谓的难题也就不在话下。
建议小伙伴第一遍刷题可以使用 【兔系】 法。
看懂题目
万事开头难,看懂题目是做好一道算法题最开始也是最重要的一步。
我将 LeetCode 上的题大致分为三种类型:
•考察数据结构,比如链表、栈、队列、哈希表、图、Trie、二叉树等
•考察基础算法,比如深度优先、广度优先、二分查找、递归等
•考察基本算法思想:递归、分治、回溯搜索、贪心、动态规划等
一些算法题目会在标题或题目描述中给出明确的题目类型信息,比如二叉树的重建、链表的反转。
而有一些题目中则在条件中给予暗示 :
•设计一个 O(nlogn) 的算法(分治:在一颗搜索树中完成任务,对于数据排序)
•给定一个有序数组(二分法)
•无需考虑额外的空间(用空间换时间上的优化)
•数据规模大概是 10000(O(n^2)就可以)
•问题可以被递归解决(动态规划)
无论怎样,当你拿到一道算法题的时候,希望你能先去弄明白这道题目要考察的是什么,是简单的数据结构还是复杂的算法思想。
先去理清题目背后解法要用的技术,这样,这道算法题目才有做下去的可能。
不要忽视暴力解法
一般来说,BAT 等大厂的算法面试题基本上都是 Medium 级别及以下,并希望面试者能在 20 分钟以内给出一个「相对正确」的回答。
为什么说是 相对正确 ?
每一道算法题得解法都有很多种,并不是说你没有给出完美解或者最优解你就是错的。
“正确” 本身是一个相对概念。
在算法面试或者平时的算法练习时,如果没有头绪,可以尝试使用暴力解法。
(不要忽视暴力解法。暴力解法通常是思考的起点。)
当你使用了暴力解法之后,可以与面试官进行沟通优化,把这个过程看作是和面试官一起探讨一个问题的解决方案的过程,这也可以让面试官了解你的思考问题的方式。这也是一个“正确”的回答方式。
先实现功能再去优化。
Done is better than perfect 。
实际编写
到这一步就是算法的落地了:将上面的思考结果思路转换为代码。
在编写的过程中需要注意题目中的边界条件,比如数组是否为空,指针是否为 NULL;同时也要注意代码的规范性:变量名,模块化,复用性。
做好总结
一定要做好总结,特别是当没有解出题来,没有思路的时候,一定要通过结束阶段的总结来反思犯了什么错误。解出来了也一定要总结题目的特点,题目中哪些要素是解出该题的关键。不做总结的话,花掉的时间所得到的收获通常只有 50% 左右。
在题目完成后,要特别注意总结此题最后是归纳到哪种类型中,它在这种类型中的独特之处是什么。经过总结,这样题目才会变成你在此问题域中的积累。
做好总结,让每道题都有最大的收获。一个月之后自己的状态应该会有很大变化。[1]
最后,承认刷 LeetCode 很吃力很正常
你我都是普通的程序员,不像那些玩 ACM,拳打 LeetCode,脚踩剑指 offer,我们得接受现实:刷题,就是很痛苦很打击的过程。
但,一遍一遍的刷,多刷一题就多掌握一题,你总会比别人更强一点。
大家一起加油:)
欢迎关注「五分钟学算法」,和程序员小吴一起来学算法!
非计算机专业,想刷leetcode,请问在此之前需要做什么准备?
,在开始Leetcoding之前,你需要学习/整理重要主题列表。如果不这样做,最终将浪费时间。请记住以下两个规则:
- 不要在准备工作上花费太多时间。
- 不要在准备工作上花费太多时间。
如果您花太多时间学习,您将永远无法解决Leetcode / CTCI问题。相反,如果您在准备工作上花费的时间太少,就会迷失方向。重要的是您要花费适当的时间进行准备工作,以确保您不会浪费时间。
在执行任何操作之前,请确保阅读/学习以下主题。学习任何其他内容可能会浪费您的时间。有些人学习的方式超出了他们需要的方式(花式图算法,生成树,A *等),因为他们认为这将使他们成为更好的工程师。我认为那完全是浪费时间。大多数采访者自己都不记得这些话题。一旦找到理想的工作,就可以自己学习。不要浪费时间。只需关注下面的数据结构和算法,仅此而已。
数据结构
- 动态阵列
- 链表
- 堆叠与排队
- 哈希表
- 二进制搜索树
- 二进制堆和优先级队列
- 图表
算法
- 位操作和数字-差异无符号与有符号
- 排序稳定性
- 合并排序
- 快速排序
- 堆排序-就地排序以获取O(1)空间
- 二元搜寻
- 排列
- 子集
- BFS图
- DFS图
- Dijkstra算法
- 拓扑排序
准备工作
一旦您对上面的数据结构和算法感到满意,请多次进行以下练习(至少2–3次),直到您可以闭上眼睛进行练习。
- 从头开始实现ArrayList
- 反向链接列表
- 使用数组实现堆栈和队列
- 用简单的哈希函数实现哈希表
- 使用邻接表实现图,然后为BFS和DFS编写函数。
- 递归和迭代地编写二进制搜索算法
- 编写合并排序算法
- 编写快速排序算法
- 使用DFS(按顺序,前顺序和后顺序-它们全部三个)和BFS二叉树。
记住常见算法的时间和空间复杂性和了解这些重要的位操作技巧。这些可能是你入门生涯中最困难的时刻。一方面,我希望你认真对待所有这一切。另一方面,我希望你意识到自己会记住并珍惜这些时刻。在获得梦想的工作之后,您实际上会错过这些艰苦的工作和努力解决算法难题的宝贵时刻。
想学C++,但目前只想用它刷leetcode上的算法,请问需要学到什么程度?
LeetCode上的算法题我也经常刷,为了达到性能要求,使用C或者C++是最好的选择!
我从事C++软件开发已经有三年了,用到的C++技术很多所以个人需要掌握的也比较多,但这只是企业对员工技术水平的硬性要求,因此很多C++开发技术你们刷题或者面试可能并不会碰到,那么下面就针对于C++初学者或者题主这样的刷题人员总结下C++技能需要掌握的程度与范围!
刷LeetCode算法题需要掌握的C++技能范围推荐
C++语法规则 —— 头文件,函数,变量,分号,注释,括号等
变量的声明与使用 —— 清楚变量命名规则,清楚数据类型,熟练掌握声明与初始化
函数的定义与调用 —— 参数类型,参数传递方式(引用,指针),返回值
部分STL容器的使用 —— vector,map,list,set等
类编程 —— 公有,私有,保护成员成员的规则与使用
作用域 —— 清楚作用域的概念
位操作符号 —— 加减乘除的位操作方式
逻辑运算 —— 与或非
循环语句,判断语句 —— 最基本的技能
部分数据结构 —— 指针,链表等
其他技能 ——按需自学补充
拓展下企业C++开发技能
多类继承
模板函数
模板类
虚函数
单例模式
运算符重载
函数重载
多态
异常处理
文件操作等等