🎉 黑五感恩回馈!VIP、蓝莓大促销,抢购开始!🦃 点击查看详情
查看: 12288|回复: 0
收起左侧

[其他] 刷题过程中特别有帮助的课程

     关闭 |只看干货
dontbeevil | 显示全部楼层 |阅读模式
本楼: 👍   100% (14)
 
 
0% (0)   👎
全局: 👍   100% (179)
 
 
0% (0)    👎

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
我从2sum不会写,到过了狗家和脸家实习的电面。走了很多弯路。现在回过头来看,埋头猛刷,其实不一定是最有效的方式。尤其是Google,面试过程中,特别强调交流。所以我们平时刷题就需要安装四个步骤来要求自己。

第一是communication。一定要和考官交流思路,还有就是不明白的地方一定要问清楚。
第二是problem solving,要展示自己的解决问题的策略。比如选数据结构什么的,一定要讲明白为什么要用各种算法和数据结构。
第三是coding。在前面两步的基础上,写出来干净正确的代码。
第四是testing,一定要回去验证自己的代码。这个过程中可以分析一下代码的复杂度。

怎么去练以上的步骤,有详细过程解析的入门教程就能起到很重要的作用。我在刷题的中期,在地里推荐下,看了educative的课程。特别有帮助。我现在大概介绍一下我用过的几门课:

Grokking Dynamic Programming Patterns for Coding Interviews . 这门课主要是针对DP,大部分的题都用递归,Top-Down, Bottom up三种方法解一遍,来龙去脉讲得非常清楚。特别适合DP有一定感觉,但又不能融汇贯通的小伙伴。


Data Structures in Java: An Interview Refresher.这一门课是把数据结构里面的基础数据结构都用java实现了一遍,对于用java的同学特别有帮助,java的基础在刷题的过程中,还是要必须掌握的。从复杂度开始,Arrays,LinkedLists, Stacks/Queues, Graphs, Trees, Trie, Heaps, Hash Tables,全都实现了一遍。而且还有配套的基础LeetCode题。是一个入门的很棒的教程。

Coderust: Hacking the Coding Interview.这门课精选了八十左右道题,每道题都有详细的讲解,对我最有帮助的地方是里面的代码运行步骤,特别详细,对代码的理解特别有帮助。

Grokking the Coding Interview: Patterns for Coding Questions.这么课程是一个总结提高的课程,它把算法面试的遇到的题型分成了各种模式,每类题各个击破。比如最经典的sliding window模式,Two pointers模式,快慢指针模式,合并intervals模式,cyclic sort模式,in-place翻转链表模式,树上的BFS,树上的DFS,双Heaps模式,subsets模式,二分法变种,Top K模式,多路模式(K-ways),0/1背包,拓扑排序。

当然还有一名最出名的:Grokking the System Design Interview.鼎鼎大名的System Design课程。

其他还有很多课程可以选择,可以去搜索

评分

参与人数 42大米 +67 收起 理由
ll123 + 1 赞一个
ccvzz + 1 给你点个赞!
Jonathan张 + 2 给你点个赞!
lemoncorn1123 + 1 很有用的信息!
getDone1 + 1
tryharder11 + 1
doncic + 1 很有用的信息!
tryharder + 1

查看全部评分


上一篇:灵魂发问:递归在面试考察中到底什么水平??
下一篇:dfs travel -> divide_conquer -> 记忆化搜索 -> for loop dp

本帖被以下淘专辑推荐:

swsyhhy 2019-10-13 15:07:33
本楼: 👍   100% (12)
 
 
0% (0)   👎
全局: 👍   96% (152)
 
 
3% (6)    👎
这四点都非常重要,但是我觉得其实第二点是最重要啊,甚至可以说是其他几点的基石
我来谈一谈我在这种点上的体会
首先,我是一个ACMer,对一些算法或者数据结构的细节理解也会好一些,所以在刷题的时候,关注的不是这题应该怎么解,而是为什么选择这种解答。
我的做法则是,在解题的时候,多想一想有没有别的解法,每种解法各有什么优缺点。如果觉得想不出来更多的做法了,去discussion里面多翻一下别人的解法
可能的优缺点如下
1. 写法节俭:有库函数能用,更简单的数据结构,更方便的建模,更直观的思路。
    1. 例如,LC 4那个丧心病狂的分类讨论,有些代码就能用更少的分类cover所有情况,从而更容易帮你,帮面试官理解解法,直接降低沟通代价。
    2. 甚至同样的逻辑,不同的写法,都能成为你和面试官讲解的点。比如,怎么写,代码会更简洁,或者更容易理解。不太建议用一些奇怪的位运算(尽管看起来很牛逼),影响阅读。
2. 时间、空间复杂度:对于各个数据结构每种操作的时间复杂度,要烂熟于心。在和面试官沟通的时候也能有理有据。
    1. 例如,翻转链表。当时我随口说了一句,可以写递归也可以写循环。面试官问我有啥区别,我说,虽然都是O(N)的时间和空间,但是因为递归要使用函数栈,一方面一个函数的空间更大(从汇编角度理解一下)也有栈溢出的危险,另一方面底层CPU执行的时候也要进行更多的指令跳转,明显没有顺序执行快。
    2. 有的算法,最坏时间复杂度是一样的,但是平均时间复杂度不一样。比如,LC 126。我当时想了俩方法,一个是用图论的方式建了一个图,然后再用最短路做,最坏时间复杂度和平均时间复杂度是一样的,因为建图的时候是永远O(N^2);但是如果用bfs,那就因为剪枝和搜索的特性,最坏时间复杂度也是O(N^2),但是平均时间复杂度明显是优于最坏时间复杂度的。
这种小细节,可以让面试官对你刮目相看;会让他觉得你对某些东西理解深入。而且你也有亮点点可以和面试官去谈。
3. 多种方式的解答。其实大家有时候也可以练习怎么快速地讲解一个复杂度很高,但是非常直接的解法。这种时候,碰到题目可以用很简单的方式和面试官描述清楚最初的朴素解法。我个人不太喜欢一上来就直接上最优解(除非没有非常直接的解法的情况,爆搜这种解法不算)

和面试官沟通,最主要是有料,有料了怎么聊都不尴尬。那么怎么做到有料,就是抓住细节。怎么抓住细节,对比不同解法的区别,解法则源自于discussion。

评分

参与人数 4大米 +6 收起 理由
芒果农夫 + 2 谢谢分享
everending + 1 赞一个
Glaces + 1 给你点个赞!
dustbin + 2 给你点个赞!

查看全部评分

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表