Open ShannonChenCHN opened 4 years ago
首先要意识到,算法是一种技能,是可以通过科学合理的方式训练出来的能力。
先按标签来刷,然后再按难度从低到高来刷,一般 Easy 和 Medium 就已经足够应对大多数面试了。
按算法的分类来选题和刷题,这种做法可以极大的提高刷题的速度,而且能带来更好的效果。一是持续地刷同个类型的题目,可以不断地巩固和加深理解。二是,可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。
当然,在能力已经比较强的时候,可以采用打散的方式来刷题,可以更好地锻炼思维的灵活性和应变能力,但初期或能力较弱的时候,按分类选题,是比较好的。
刚开始接触某一个标签题型时,自己很难想出答案或者高质量的答案,如果自己思考 5 分钟后还没有解题思路,可以去看别人的题解(discussion)。
通过查看博客和讨论部分后对该题有基本思路,我们再去做这道题。对于同一类标签的题做多后,我们对这一类标签的题就会熟悉,下次遇到同样主题的题目就不会完全没有思路。
一定要坚持,坚持每天都刷题,遇到难题后不要灰心,静下心来看看别人的解题思路,看懂后自己再总结,要相信自己一定可以把它弄懂的。
解题三部曲:1. 看懂题目;2. 分析,推导解法;3. 将思路转换为代码
图1 互联网公司面试中经常考察的问题类型
作为在电话 / 现场面试中短短不到一个小时时间内,提供给面试者白板编程解决的算法题目,它笔试上机、编程竞赛中的题目在难度与形式上还是有一些不同的。在难度上(尤其是代码难度上)会略低一些,倾向于考察一些基础数据结构与算法,对于高级算法和奇技淫巧一般不作考察。
算法与数据结构是面试考察的重中之重,也是大家日后刷题时需要着重训练的部分。简单的总结一下,大约有这些内容:
算法,主要是以下几种:
基础技巧:分治、倍增、二分、贪心 排序算法:快速排序、归并排序、计数排序 搜索算法:回溯、递归、剪枝技巧、深度优先遍历,广度优先遍历,二叉搜索树等 图论:最短路径、最小生成树、网络流建模 动态规划:背包问题、最长子序列、计数问题
数据结构,主要有如下几种:
数组与链表:单 / 双向链表、跳舞链 栈与队列 哈希表 堆:大 / 小根堆、可并堆 树与图:最近公共祖先、并查集 字符串:前缀树(字典树) / 后缀树
算法部分:
数据结构部分:
编程能力就像任何其他技能一样,也是一个可以通过 刻意练习 大大提高的。
大多数经典面试题目都有多种解决方案。 为了达到最佳的练习效果,我们强烈建议您至少将常考题目清单里的题目练习两遍,如果可以的话,三遍会更好。
在第二遍练习时,你可能会发现一些新的技巧或新的方法。 到第三遍的时候,你会发现你的代码要比第一次提交时更加简洁。 如果你达到了这样的效果,那么恭喜你,你已经掌握了正确的练习方法!
记住:刻意练习并不意味着寻找答案并记住它,这种练习方法不是长久之计。 在没有参考答案情况下,越能自主解决问题,才越能提高自身能力。
练习的时候最好模拟面试的实际情况来,限制时长,5 分钟内就要想出思路,最优解想不出来,可以先用暴力解法写出来。平时练习要求严格了,给压力了,面试时才不至于太紧张。
2021.05.13 ~ 2021.05.24
一、复杂度分析 二、数组和字符串(8道题)⭐️ 三、链表(8道题)⭐️ 四、栈(10道题) 五、队列(4道题) 六、排序(10种排序算法+8道题) 七、查找(二分查找算法+9道题)⭐️ 八、优先队列和堆(堆的实现+3道题) 九、Trie(3道题) 十、贪心算法(4道题) 十一、位运算和数学问题(10道题) 十二、滑动窗口(4道题) 十三、回溯算法(6道题) 十四、设计题(3道题) 十五、树(树的理论知识+20道题)⭐️ 十六、动态规划(20道题) 十七、哈希表
05.24
T(n)=O(f(n))
O(1)
、O(logn)
、O(n)
、O(nlogn)
、O(n^2)
、O(n^3)
...O(2^n)
、O(n!)
05.24
题库来源:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x6w3ds/
数组
字符串
Character
的常用 API
asciiValue
isNumber
isLetter
isWhitespace
isNewline
wholeNumberValue
lowercased()
uppercased()
String
中的字符,我们可以将一个 String
类型的变量转成 Array
,比如 let str = "abc"
可以转成 let charArray = Array(str)
Int.max
的逆操作,比如判断某数乘 10 是否会溢出,那么就把该数和 Int.max
除 10 进行比较:num > Int.max / 10 || (num == Int.max / 10 && curChar.wholeNumberValue > Int.max % 10)
05.13 ~ 05.15
必做题
附加题
进阶题
05.15
关于栈的题型主要有以下几类: 1). 首先是跟栈数据结构本身相关的,可以直接从标题或者描述中看出来是要考察栈的,比如 剑指 Offer 31. 栈的压入、弹出序列、155. Min Stack。 2). 另外一类是跟栈的几个典型应用场景相关的:
3). 还有一类题型是因为正好可以利用栈“后进先出”的特性来解决问题的(但并不一定是最优解),比如回删操作、后退操作这类问题,相关题目有 844. Backspace String Compare、19. 删除链表倒数第 n 个结点 和 682. Baseball Game 。
Swift 中没有 Stack
类,但是可以用数组模拟栈的操作。popLast()
相当于 pop 操作,append()
相当于 push 操作
05.16
05.16
实现几种常见的排序算法,并计算相应的时间复杂度和空间复杂度
LeetCode
其他
partition
函数的实现05.16
05.16
05.16
05.17
05.17
&
,或 |
,非 ~
,异或 ^
,左移 <<
,右移 >>
(x & 1) == 1
等价于 (x % 2 == 1)
(x & 1) == 0
等价于 (x % 2 == 0)
x / 2
等价于 x >> 1
x &= (x - 1)
把x最低位的二进制1给去掉x & -x
只保留最低位的1,而把其他位的1都去掉x & ~x
得到 0x^0 = x
x ^ x = 0
05.18
05.18
05.18
05.22
见 #25
05.23
i
j
递增,但是有些特殊情况也要具体分析,比如 [5. 最长回文子串]() 这一题dp[i][j]
表示前 i
, j
个字符串的状态,但是在遍历字符串时一定要记得前 i
个字符串的最后一个字符是第 i-1
位而不是第 i
位。比如 10. 正则表达式匹配
https://leetcode.com/
参考
补充资料