二叉搜索树(BinarySearch)的飞跃呢?|

作者 |拉迪卡·莫拉比亚

翻译 |香槟超新星,主编 |郭锐

头图| CSDN从视觉中国下载

制作 | CSDN(ID:CSDNnews)

以下为译文:

2020 年是动荡的一年。

我对自己的“2020学习计划”已经不满意了,因为这个计划中的很多重点,都是建立在今年不用担心被裁员的前提下的。但现在情况发生了变化,对任何人来说都是如此。

最近,我唯一的重点是准备和学习面试。对于我的工作,这涉及到 3 个领域的学习:算法、系统设计和实际的 React/Node 项目。

目前我在工作中已经做了足够多的React和Node实践,系统设计的学习最好在面试时的突击面试中完成。因此,在接下来的这段时间里,我将专注于在算法上取得进展。

我有两个限制:一个是我下班后每天只想学习 1 小时,或者每周总共少于 8 小时。第二个是我只知道 JavaScript,不想用我还不精通的语言(例如 Java)编写代码。

所以,假设你已经做了一些编程练习题,也做了一些简单的 LeetCode 题,并且对如何解决它们有点熟悉,并且假设你没有 CS 背景,那么我们如何才能有所突破呢? ,如何实现从“二和”到“二叉搜索树”的飞跃?

下面是我的方法。

课程表

学习算法分为几个步骤。如果您太仓促地进入课程,很容易忘记课程与您现有知识的联系。而如果你只是固执地练习而不参考外部资源,你可能甚至不知道这些问题的知识点是什么。在某些节点之间平衡两者至关重要。

我现在确定我已经完成了足够多的数组和字符串操作问题,并且迫切需要对我知识差距的指导和结构意识。我需要基础知识。

有几种方法,但是在失败了这么多次之后,我觉得我需要一个非常具体的反馈循环。

首先,阅读新概念。您可以阅读材料或观看视频。这一步应该注重实用性,并尽可能少地包含词汇。有一个图标会很好。在这个阶段,编程问题的例子只会让你感到困惑。

然后,我需要沉浸其中。给我一个问题。让我失败。让我完全做,但我不太了解。

最后,我需要回顾问题本身,而不是概念。我不仅需要看到正确的解决方案,还需要看到正确解决方案的过程是什么样的。

重复多次后,图案开始出现。请注意,您不需要为每个新问题阅读新概念。应该更频繁地进行“实践-审查”周期。

据我所知,InterviewCake 提供了最好的反馈循环。还有一些其他服务可以处理“问题审查”过程,但对我来说最困难的部分是获得一个逐步的课程列表,以补充我所缺乏的基础知识。由于 Covid19,它目前的价格为 29 美元,所以虽然我还不能说我推荐它,但我至少建议你先看看。

InterviewCake 处理“阅读问题”过程。它在一定程度上处理了“审查”部分,但我认为光看它是不够的,它需要额外的材料。

除了InterviewCake,我还有一些事情要做:

阅读:William Fiset 的《易于进阶的数据结构》。 Chris 在一篇关于他自己的算法学习的精彩博客文章中推荐了这种方法(链接:)。很高兴有关于 InterviewCake 的阅读材料和 YouTube 上的解说视频。问题:LeetCode。我还能说什么?我没有对此做任何具体的事情,只需按照我已经在 InterviewCake 上学到的内容进行操作即可。回顾: LeetCode 的一大优点是它很受欢迎,所以我可以在 YouTube 上找到我的问题的答案。这些教学视频通常需要 Java 和 Python 的基本技能。我相信这两种语言都值得花一个周末来学习将它们翻译成 JavaScript。

通过 YouTube 进行审核可能是最关键的一步。解决“两个数字之和”的问题确实很有趣,但是如何真正地做“两个数字之和”呢?如何优化?你缺少什么?模式匹配会随着时间的推移而建立,但仅仅做问题是不够的。你必须知道什么是正确的答案才能在下一次做正确的事。请老师指教或参考别人的解决方案,参考别人的做法,这样你才能逐渐提高。

过程

我有工作要做。我不能把所有的精力都放在这上面。我会尝试每天做一个问题,这可能需要一些预读,当然也需要事后回顾。

本来想每隔一段时间重复这些编程题怎么把未来教育电脑题库复制,每次都能达到更好的效果,但是后来发现LeetCode上的题已经够多了,就没必要重复了。

所以怎么把未来教育电脑题库复制,举个栗子说:

我登录 InterviewCake 并查看我的课程列表中的下一个内容。如果有相关的阅读材料,我会阅读。我还会查看“数据结构”播放列表,看看是否有关于此主题的视频可供观看。

然后我将解决课程的作业问题。如果练习完成了,我会去 LeetCode 找一些这方面的练习。

我将完成这个问题,保存我的答案,然后前往 YouTube 或 InterviewCake 的答案部分进行审核。我会记下我错过的内容以及优化的解决方案。

明天,我会重复这个过程。

我是如何解决这个问题的?

算法不仅仅意味着重复点击 LeetCode 提交按钮,它是一个过程。我将在下面介绍的大部分过程都是从 Chris 关于学习他自己的算法的精彩博文中借用的,但我真的很喜欢这一部分。

养成写问题日志的习惯

我认为这就是能够“做对”的人和说他们永远无法理解的人之间的区别。写下你解决的每一个问题并做笔记。

这些笔记中的内容自然而然——标题、类别、关于解决问题的模式的笔记、多次解决问题时的解决方案列表,以及回顾时的笔记。

如果您想在纸上写字(我也愿意),您还应该在您的解决方案中附上电子期刊,便于复制粘贴。 LeetCode 本身会保存您提交的所有内容,但对我来说有点乱。

这本应该是一本比较正式的书,而且不像演戏草稿,这里不是放飞自我发散思维的地方。

解决问题

以下内容抄自克里斯的文章

解决问题涉及以下步骤:

我认为这很棒。我特别喜欢那些能准确告诉我如何思考的部分。我经常听到这些建议,但我不确定我在寻找什么。我实际上在代理草案上写下了这些问题的提示。

这很重要,所以我什至会在深入研究代码之前记录“这是一个数组操作问题,我可能应该使用对象来解决这个问题……”。

其次,在将答案输入 LeetCode 之前,将答案写在一张纸或白板上很重要。不要屈服于一时的便利。即使你被允许在面试中使用代码编辑器,你也不一定会在那种环境中感到舒服,所以你应该能够在不依赖编辑器提供的任何便利(如 console.记录!)。

如果您的第一个解决方案失败,没关系。在尝试找到问题的解决方案之前,我给了自己在 LeetCode 中调试的空间。我希望随着我不断练习,这种频率会降低。

给自己计时(并注意这一点)也很重要。一开始,花更多时间解决问题是可以的,但随着时间的推移,请尝试在 30 分钟内提交您的第一个答案版本。

不要试图一次使一切都完美。一开始,能做题是好事。然后,争取一个提交通过。然后,尝试提交优化版本。然后,争取提交优化版,一次通过,不超过30分钟。

你会变得更好并取得突破。

评论

请记住,仅仅提出问题是不够的。有很多更好的解决方案。提出问题不是重点。

自学成才的人会将“两个数之和”作为 LeetCode 的第一个问题。在解决了复杂度为 O(n ^ 2) 的问题后,他们觉得自己做得很好。两个数字的和有最好的解决方案。你必须知道这一点才能继续。

我认为重复这一步很重要,虽然有些课程可以提前教你这些技巧,但对我来说,最好在尝试后反思它们。在 YouTube 上观看竞争对手的视频是我回顾我的计划的最佳方式。

……

就是这样。我会每天做一个问题,每周 6 天。

通过一致的实践,并且知道从哪里获得知识来填补“你不知道你不知道什么”的空白,我相信任何自学成才的工程师都能够将算法达到合格的水平等级。完成后我会回来报告。

原文:

关于作者:Radhika Morabia,OpenTable 软件工程师,专攻 JavaScript。

© 版权声明
THE END
喜欢就支持一下吧
点赞70赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容