课程名称:《面试算法LeetCode刷题班》) ——BAT面试官带你刷真题、过笔试主讲老师:林老师!BAT资深研发工程师(T7/P8级),致力于搜索引擎及其子系统的研发、迭代与优化,数据分析与挖掘领域专家,多年担任校园招聘、社会招聘面试官,丰富的面试候选人经验
课程简介:
掌握算法与数据结构是成为优秀程序员的必经之路,众多国内外知名互联网企业都将算法面试作为程序员招聘的重要和必需途径,只有高效应对各类题目,将知识储备转化为面试中的优秀表现,才能获得大公司的青睐。
本门课程将程序员面试中常遇的算法与数据结构知识进行精简与归纳,细致入微地讲解笔试面试中的编程真题和相关知识点,全面提升应聘者在大型互联网公司(BAT、微软、Google等)算法面试时的竞争力,帮助应聘者脱颖而出。
课程特色:;
1.将算法与数据结构的知识进行精简与归纳,帮助学员快速掌握相应知识要点。
2.以leetcode.com、codeforces.com中的题目为例题,利用OJ刷题的方式提升学员的编码能力与解决算法面试题的能力。
面向人群:
1. 有一定的编程(C语言)基础,希望掌握与巩固算法与数据结构相关知识。
2. 寻找知名互联网企业研发工作(校园招聘、社会招聘)的应聘者,希望能够快速掌握算法与数据结构面试题目的要点与技巧,并顺利通过相应面试。
课程大纲:
第一课:链表
,
1. 链表的必备知识要点(包括基础知识、刷题中使用的STL等知识)
2. 链表逆序(LeetCode 92,206. Reverse Linked List 1,2) N# L) ^8 t& n$ h5 j
3. 求两个链表的交点(LeetCode 160. Intersection of Two Linked Lists)
4. 链表的节点交换(LeetCode 24. Swap Nodes in Pairs)
5. 链表求环(LeetCode 141,142. Linked List Cycle 1,2). i3 w9 t P1 x; W' H, i* C5 V
6. 链表重新构造(LeetCode 86. Partition List) % o% ?) e7 g$ Q
7. 复杂的链表复制(LeetCode 138. Copy List with Random Pointer)
8. 排序链表合并(2个与多个) (LeetCode 21,23 Merge Two(k) Sorted ListsLeetCode)7 k5 F$ S; y' `( a; h$ Y8 k
* A. R8 p6 Q, o5 |' \
第二课:栈、队列、堆% t. w* u, V; Y5 u/ U5 s- V
1 t: n) ]: R, r% j1 O
1. 栈、队列知识要点与实现(数组、链表)
2. 使用队列实现栈(LeetCode 232. Implement Queue using Stacks)# u; Z4 n% H+ ?7 V& Q f( J% c
3. 使用栈实现队列(LeetCode 225. Implement Stack using Queues)7 E" d: [: N, w+ @+ {7 g0 g
4. 包含min函数的栈(LeetCode 155. Min Stack)
5. 简单的计算器(栈的应用)( LeetCode 224. Basic Calculator)0 m; ~. r( U& R, z- G0 F4 g( A
6. 堆(优先级队列)知识要点与实现
7. 数组中第K大的数(堆的应用) (LeetCode 215. Kth Largest Element in an Array)/ Z4 ^9 u# }7 b2 {' D
8. 寻找中位数(堆的应用)( LeetCode 295 Find Median from Data Stream)0 e$ x: k. P) _, Q" {3 i
, {: v$ H( Q3 c$ g
第三课:贪心7 s: H/ W% Q0 c) s
* k9 i/ Z9 |, y' e3 ^2 @& N- C
1. 贪心算法知识要点,刷题必备的STL知识
2. 贪心题目1(LeetCode 455. Assign Cookies), |9 U1 _) w9 `& | b
3. 贪心题目2(LeetCode 402. Remove K Digits)* g7 Y: T& M3 M, E5 m9 E$ X
4. 贪心题目3(LeetCode 134. Gas Station), y# h% W8 L ?6 L5 S4 }- P
5. 贪心题目4(LeetCode 135. Candy)
6. 贪心题目5(LeetCode 502. IPO)6 N2 L( ?4 E4 [5 R, K
7. 贪心题目6(LeetCode 321. Create Maximum Number)
8. 贪心题目7(codeforces 582A GCD Table)3 P& T1 Z2 @! {& R* m7 }
3 H4 ?; ~4 H. O
第四课:递归、分制、回溯
1. 递归的知识要点,回溯算法3 X3 V9 m) |8 J5 ^
2. 生成组合数(LeetCode 39. Combination Sum, LeetCode 40. Combination Sum II)
3. 生成排列数(LeetCode 46. Permutations, LeetCode 47. Permutations II), }- w% j6 e) U0 _, I
4. N皇后问题(LeetCode 51. N-Queens, LeetCode 52. N-Queens II)
5. 分制算法知识要点
6. 快速排序算法与经典实现1 ^ f9 |2 ?5 S# ~
7. 不同的加括号方法(LeetCode 241. Different Ways to Add Parentheses)
8. 两个数组的中位数(LeetCode 4. Median of Two Sorted Arrays)
: g) Z2 u% C" o5 V4 [ |/ a
第五课:树与图
1. 树与图的数据结构与基本算法
2. 树遍历的回调函数实现,并使用自动机概念实现非递归树前、中、后遍历
3. 树与链表的转换(LeetCode 114. Flatten Binary Tree to Linked List). N+ u( ^! d' n( m. e& Z
4. 最近的公共祖先(LeetCode 236. Lowest Common Ancestor of a Binary Tree)
5. 树的层次遍历应用(LeetCode 199. Binary Tree Right Side View)
6. 树的改造(LeetCode 117. Populating Next Right Pointers in Each Node 1,2)
7. 图的复制(LeetCode 133. Clone Graph). d/ f/ W3 I% y/ t+ z
8. 图的搜索与应用(LeetCode 207.Course Schedule)2 O2 U" o0 ^6 L& @/ O! ~
, R. a0 ^9 H7 L/ n
第六课:二分查找、二叉排序树、位运算的应用
* E9 f; r: s- U" | \
1. 二分查找、二叉排序树的知识要点
2. 数组的二分查找(LeetCode 33,81 Search in Rotated Sorted Array 1,2), q k2 j3 K: ?, X+ ?+ _2 m" n
3. 区间二分查找(LeetCode 34. Search for a Range)# z7 v) [0 T# X1 F7 h2 \- k8 g
4. 排序链表转换为二叉排序树(LeetCode 109. Convert Sorted List to B- Search Tree)6 P% ?4 d. |) `
5. 二叉排序树的遍历与改造(LeetCode 538 Convert BST to Greater Tree)
6. 二叉排序树中的第K大的数(LeetCode 230. Kth Smallest Element in a BST)9 M# u+ V8 ^2 P& w
7. 位运算的知识要点, Q; ?/ C% q6 U$ P) A9 D
8. 使用位运算表示集合(LeetCode 78. Subsets). N: S+ e# ]/ z* X) M
9. 位运算应用题目(LeetCode 136,137,260. Single Number1,2,3), x+ n. }4 i9 D2 V1 @
# d3 C6 s) x' Y; a" E
第七课:哈希表与字符串
, G" y' X7 N6 J0 s% q* ^
1. 哈希表与字符串知识要点
2. 哈希题目 (LeetCode 290. Word Pattern)
3. 哈希与字符串综合 (LeetCode 3.Longest Substring Without Repeating Characters)) E- K1 X4 Z6 J' K
4. 哈希与字符串综合 (LeetCode 76. Minimum Window Substring); n9 {% E8 u" d. @; G$ o q
5. 哈希与字符串综合 (LeetCode 30. Substring with Concatenation of All Words)' q( l- v. P3 c d
6. 字符串题目 (LeetCode 459. Repeated Substring Pattern)# a: Q$ ], S8 w3 L, \1 D8 ^0 `. ~
7. 字符串题目 (LeetCode 468. Validate IP Address)0 x8 n3 k! q) \: {, h
第八课:搜索) @. B; W! \: K; b8 y
1. 深度优先搜索与广度优先搜索算法$ ~: A- l9 v! \6 A/ t
2. 深搜题目 (LeetCode 200. Number of Islands)6 d! V; p7 Z5 j E+ L+ Q8 }% _$ d
3. 深搜题目 (LeetCode 473. Matchsticks to Square)
4. 深搜题目 (LeetCode 491. Increasing Subsequences). }9 i: M/ E" x% |7 s
5. 广搜题目 (LeetCode 126,127 Word Ladder 1,2)9 }. H3 Y. }9 s& [1 n* M
6. 广搜题目 (LeetCode 417. Pacific Atlantic Water Flow)
7. 广搜题目 (LeetCode 407. Trapping Rain Water II); a$ p# a9 y5 H# h; N% t# r/ _/ ~
0 H; J9 S1 ?- d' U- a) \; b
第九课:动态规划6 G f5 D Q7 }6 p# j' F4 I
: Y3 [0 i1 ` p$ Y6 i8 P: X
1. 动态规划知识要点$ p! w& h& l' F# C
2. 动态规划题目1(LeetCode 120. Triangle)" h. N$ [9 l5 C/ j& g1 W7 C
3. 动态规划题目2(LeetCode 53. Maximum Subarray)
4. 动态规划题目3(LeetCode 198,213. House Robber 1,2)5 z/ k- a: R4 n0 f) p% G, O
5. 动态规划题目4(LeetCode 322. Coin Change)
6. 动态规划题目5(LeetCode 72. Edit Distance)
7. 动态规划题目6(LeetCode 174. Dungeon Game)+ f4 g p1 c$ T8 a) b7 ?- y
8. 动态规划题目7(codeforces 711C Coloring Trees)* w& m% r, c1 M; v/ |. ~" V- u
第十课:复杂数据结构& }* u7 O m' B" U: B
1. Trie树的构造与基本算法
2. Trie树的构造 (LeetCode 208. Implement Trie (Prefix Tree))+ D- q$ ~* H h( J" d n* h
3. Trie树的应用 (LeetCode 212. Word Search II)* c8 m& V7 z7 e
4. 并查集的基本算法7 m, T% I/ P4 l& P9 H7 k+ O3 I
5. 并查集的应用 (LeetCode 547. Friend Circles)
6. 线段树与树状数组; K4 P( v& Q% l0 u7 R
7. 线段树与树状数组的应用(LeetCode 307. Range Sum Query – Mutable)- {-
《设计模式之美2020年6月视频教程》设计模式之美2020年6月视频教程 Java视频教程目录:
00:开篇词:一对一的设计与编码集训,让你告别没有成长的烂代码!
01:为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
02:从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?
03:面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系
04:理论一:当谈论面向对象的时候,我们到底在谈论什么?
05:理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
06:理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
07:理论四:哪些代码设计看似是面向对象,实际是面向过程的?
08:理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?. a# e4 w” H+ q- t, }3 n” s0 [0 A5 N
09:理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?
10:理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?
11:实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
12:实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?. I! {+ {0 k/ u( ?2 r
13:实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?) U7 b& K, U3 |; Y’ ~$ ?
14:实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
15:理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?; X% H9 @1 X9 W- q: i: F# B6 e/ h3 x, f# T
16:理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17:理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?/ \8 }/ R7 T4 C
18:理论四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解? k* ~1 i# J& B l) v” n6 Z( H
19:理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?1 b% Z” Y$ k6 a” l( u
20:理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?2 |% g” v) T; O: ^/ x+ p4 o( W+ e
21:理论七:重复的代码就一定违背DRY吗?如何提高代码的复用性?
22:理论八:如何用迪米特法则(LOD)实现“高内聚、松耦合”? 7 f8 m/ T7 k7 N5 Y$ |3 \7 o
23:实战一(上):针对业务系统的开发,如何做需求分析和设计?” r5 w2 S( r4 y, o& s7 g6 f/ v
24:实战一(下):如何实现一个遵从设计原则的积分兑换系统?
25:实战二(上):针对非业务的通用框架开发,如何做需求分析和设计?8 {4 e* q: u+ s8 ^& z4 Y
26:实战二(下):如何实现一个支持各种统计规则的性能计数器?
27:理论一:什么情况下要重构?到底重构什么?又该如何重构?
28:理论二:为了保证重构不出错,有哪些非常能落地的技术手段?/ ~2 ?8 W! Z7 S2 y
29:理论三:什么是代码的可测试性?如何写出可测试性好的代码?, }8 [; a* Q! _( c, d
30:理论四:如何通过封装、抽象、模块化、中间层等解耦代码?
31:理论五:让你最快速地改善代码质量的20条编程规范(上)
32:理论五:让你最快速地改善代码质量的20条编程规范(中)
33:理论五:让你最快速地改善代码质量的20条编程规范(下)” y! y” Y m; w
34:实战一(上):通过一段ID生成器代码,学习如何发现代码质量问题
35:实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”
36:实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象? I# \4 L: j! ^2 @! {
37:实战二(下):重构ID生成器项目中各函数的异常处理代码
38:总结回顾面向对象、设计原则、编程规范、重构技巧等知识点3 T9 M0 C4 S* z! z’ i0 z. v# [( ]
39:运用学过的设计原则和思想完善之前讲的性能计数器项目(上)
40:运用学过的设计原则和思想完善之前讲的性能计数器项目(下), S. V: y6 K( s’ N1 A: {! |
41:单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?, _; N4 s O7 A, Q
42:单例模式(中):我为什么不推荐使用单例模式?又有何替代方案?
43:单例模式(下):如何设计实现一个集群环境下的分布式单例模式?
44:工厂模式(上):我为什么说没事不要随便用工厂模式创建对象?$ C/ T# B1 x” S {0 j8 ~) x
45:工厂模式(下):如何设计实现一个DependencyInjection框架?3 z$ Z. k# b i) x4 x6 V
46:建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式– c8 `0 M! ~3 q- G, T
47:原型模式:如何最快速地clone一个HashMap散列表?– w4 B) ?% g* k8 B” l
48:代理模式:代理在RPC、缓存、监控等场景中的应用
49:桥接模式:如何实现支持不同类型和渠道的消息推送系统?
50:装饰器模式:通过剖析JavaIO类库源码学习装饰器模式‘ @( [) ~+ ^$ X2 ~8 K! |
51:适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?
52:门面模式:如何设计合理的接口粒度以兼顾接口的易用性和通用性?2 B8 T, C; O$ }2 z& ~% d’ g
53:组合模式:如何设计实现支持递归遍历的文件系统目录树结构?. @1 K’ J x6 e0 w# \7 a# b9 [0 g
54:享元模式(上):如何利用享元模式优化文本编辑器的内存占用?; ]4 n Z) j# N) j& G0 w& U+ T/ `0 p
55:享元模式(下):剖析享元模式在JavaInteger、String中的应用
56:观察者模式(上):详解各种应用场景下观察者模式的不同实现方式2 \1 l) z” J1 B2 l3 c9 P% E$ j
57:观察者模式(下):如何实现一个异步非阻塞的EventBus框架?
58:模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用/ I5 u6 c7 X+ ]7 Z0 a$ V
59:模板模式(下):模板模式与Callback回调函数有何区别和联系?
60:策略模式(上):如何避免冗长的if-else-switch分支判断代码?. Q* b8 A: ^8 d4 o
61:策略模式(下):如何实现一个支持给不同大小文件排序的小程序?javazx.com
62:职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?
63:职责链模式(下):框架中常用的过滤器、拦截器是如何实现的?
64:状态模式:游戏、工作流引擎中常用的状态机是如何实现的?( p” W( j! {* d) ?. |3 S
65:迭代器模式(上):相比直接遍历集合数据,使用迭代器有哪些优势?
66:迭代器模式(中):遍历集合的同时,为什么不能增删集合元素?6 ~4 _/ y, L/ I( J) E7 U
67:迭代器模式(下):如何设计实现一个支持“快照”功能的iterator?% G& b2 N+ j% j’ `’ F% V
68:访问者模式(上):手把手带你还原访问者模式诞生的思维过程
69:访问者模式(下):为什么支持双分派的语言不需要访问者模式?5 A5 n( T$ x” A& ]
70:备忘录模式:对于大对象的备份和恢复,如何优化内存和时间的消耗?, j, `: m8 d. o, r0 F” e5 Y
71:命令模式:如何利用命令模式实现一个手游后端架构?
72:解释器模式:如何设计实现一个自定义接口告警规则功能?
73:中介模式:什么时候用中介模式?什么时候用观察者模式?3 q1 e% a) M# G! w& U t
74:总结回顾23种经典设计模式的原理、背后的思想、应用场景等
75:在实际的项目开发中,如何避免过度设计?又如何避免设计不足?4 P’ L: p. U’ P, c” a( M
76:开源实战一(上):通过剖析JavaJDK源码学习灵活应用设计模式7 Q/ g; ]5 |5 h$ Q5 z5 q( d, t
77:开源实战一(下):通过剖析JavaJDK源码学习灵活应用设计模式3 u9 G# h” h1 `/ F
78:开源实战二(上):从Unix开源开发学习应对大型复杂项目开发
79:开源实战二(中):从Unix开源开发学习应对大型复杂项目开发, j) `+ C* I! ^# N1 |” W9 y# K
80:开源实战二(下):从Unix开源开发学习应对大型复杂项目开发
81:开源实战三(上):借GoogleGuava学习发现和开发通用功能模块” r” {3 n5 S: a7 n# Y7 T
82:开源实战三(中):剖析GoogleGuava中用到的几种设计模式
83:开源实战三(下):借GoogleGuava学习三大编程范式中的函数式编程5 ~. O U7 k’ E
84:开源实战四(上):剖析Spring框架中蕴含的经典设计思想或原则‘ z4 O. Q% g+ ?
85:开源实战四(中):剖析Spring框架中用来支持扩展的两种设计模式
86:开源实战四(下):总结Spring框架用到的11种设计模式# U’ o* M” P$ n* p
87:开源实战五(上):MyBatis如何权衡易用性、性能和灵活性?9 ]( N6 v5 s! l3 |& o’ u# i
88:开源实战五(中):如何利用职责链与代理模式实现MyBatisPlugin?
89:开源实战五(下):总结MyBatis框架中用到的10种设计模式+ d8 b( ]( i. W# x9 R+ F
90:项目实战一:设计实现一个支持各种算法的限流框架(分析)
91:项目实战一:设计实现一个支持各种算法的限流框架(设计)) n1 R5 p! d: F# p$ a9 I1 e’ T
92:项目实战一:设计实现一个支持各种算法的限流框架(实现); H: O3 V3 \9 I’ e
93:项目实战二:设计实现一个通用的接口幂等框架(分析)
94:项目实战二:设计实现一个通用的接口幂等框架(设计)
95:项目实战二:设计实现一个通用的接口幂等框架(实现)
96:项目实战三:设计实现一个支持自定义规则的灰度发布组件(分析)
97:项目实战三:设计实现一个支持自定义规则的灰度发布组件(设计)+ b8 |; G( }, { M8 n; d
98:项目实战三:设计实现一个支持自定义规则的灰度发布组件(实现)
99:总结回顾:在实际软件开发中常用的设计思想、原则和模式
100:如何将设计思想、原则、模式等理论知识应用到项目中?7 F. ?6 S) L5 y/ K4 P
春节特别加餐:王争:如何学习本课‘ s2 z; h: |& f. a
加餐一:用一篇文章带你了解专栏中用到的所有Java语法
加餐二:设计模式、重构、编程规范等相关书籍推荐) |) L7 w& T. Y/ q: H’ Q4 Q
加餐三:聊一聊Google是如何做CodeReview的. c; ^! A) P* @3 V
加餐四:聊一聊Google那些让我快速成长的地方‘ A9 e% s& L( S# H5 y, t
加餐五:听一听小争哥对Google工程师文化的解读