我有一个想法,不一定对
我觉得高水平的程序员是可以速成的。
目前的自己也算是个高水平的程序员吧,一口气拿下了字节、阿里、百度三家公司的offer。
当我还是一名普通的程序员的时候,我认为成为大神需要两个阶段:
阶段一:从普通程序猿成为熟练开发者
阶段二:从熟练开发者成为资深架构师
第一阶段需要你的专项的技术能力,第二阶段需要你成熟的技术体系。完成这两步,也许我们可以离大神更进一步。
不知道你有没有遇到过这种情况,明明刷了400-500道题,都快刷吐了,也没啥成效。而隔壁大佬随便刷个几十道都能进大厂。这就是很典型的例子。
成为高水平的程序员,重点不在于“训练”,而在于学习方法有捷径。找对了学习方法,速成就不是问题。
我自己就是个典型,当初找工作的时候口号喊得可响了,要笨鸟先飞!然后天天给自己搞题海战术,也不复盘,也不总结。面试不知道翻车多少回。
回想起当时的境况,我真的觉得自己是个傻*。直到我室友,像关爱智障一样的,给了我一套算法小抄。仿佛打开了提升算法技能的开关,天知道我当时有多感谢他...
这份算法小抄里包括了大厂面试中常考的算法及数据结构。像什么二分法、双指针、排序算法等等。还举例了常考题的解题思路和模板。是真的香!分享给跟我一样渴望成为编程大佬的同学!!
编辑切换为居中
添加图片注释,不超过 140 字(可选)
而且,这套小抄的神奇之处在于:他套上模板就能使用。
拿一道面试常考的双指针来举例:
使用条件
滑动窗口(90%) 时间复杂度 O(n) (80%是双指针) 要求原地操作,只可以使用交换,不能使用额外空间(80%) 有子数组 subarray / 字符串 substring 的关键词 (50%) 有回文 Palindrome 关键词(50%)
复杂度
时间复杂度: O(n)
时间复杂度与最内层循环主体的执行次数有关 与有多少重循环无关
空间复杂度: O(1)
只需要分配两个指针的额外内存
★实战阶段
LintCode1879.两数之和VII(同向双指针) LintCode1712.和相同的二元子数组(相向双指针) LintCode627.最长回文串(背向双指针) LintCode64:合并有序数组
它家的题型都是紧随大厂的真题实时更新的,保证了题库的新鲜度,如果你有明确的目标公司,建议你可以多刷该公司的常考题、必考题。
还可以根据实际需求按照类型的形式刷各种题目。题库按算法、数据结构、难度等不同维度进行了分类,特别适合小白较快上手,还能在线检测coding的正确率,很推荐试试。
部分代码模板
Java
编辑切换为居中
添加图片注释,不超过 140 字(可选)
Python
编辑切换为居中
添加图片注释,不超过 140 字(可选)
做完例题之后,再去领扣上找几道类似题目练练手,感觉立马就有了,其他算法知识点也是如此,举一反三,贼好用。
需要模板的话,也可以试听【算法模板】获取。
这里分享一下其他常考知识点的解题思路:
二分
排序数组 (30-40%是二分) 当面试官要求你找一个比 O(n) 更小的时间复杂度算法的时候(99%) 找到数组中的一个分割位置,使得左半部分满足某个条件,右半部分不满足(100%) 找到一个最大/最小的值使得某个条件被满足(90%)
双指针
滑动窗口 (90%) 时间复杂度要求 O(n) (80%是双指针) 要求原地操作,只可以使用交换,不能使用额外空间 (80%) 有子数组 subarray /子字符串 substring 的关键词 (50%) 有回文 Palindrome 关键词(50%)
BFS
拓扑排序(100%) 出现连通块的关键词(100%) 分层遍历(100%) 简单图最短路径(100%) 给定一个变换规则,从初始状态变到终止状态最少几步(100%)
二叉树与分治
二叉树相关的问题 (99%) 可以一分为二去分别处理之后再合并结果 (100%) 数组相关的问题 (10%)
除了学习方法有“捷径”,我还觉得,那些编程水平很高的程序员,都很会刷题。
不是像我当初那样搞题海战术,而是有针对性的刷题。
原先我刷题的时候,都觉得压力很大。因为刷太多都没效果。所以对于我来说,刷题并不能激发我的兴趣。但是后来朋友拉我去听了令狐老师的算法讲座。豁然开朗。
因为他将算法面试中常考的知识点和考察频率都罗列出来了,这样去刷题就很有针对性。我想那些编程大佬应该也是这么学习的吧。
这里分享一个面试算法的常考知识点及考察频率。如果你想要快速提升自己的算法能力,可以照这个方法试试看。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
同时这个讲座还有试听,感兴趣的朋友可以去听。
除此之外,再班门弄斧的分享一下我上岸的经验吧,我上岸之前有“临时抱佛脚”的习惯,所以我不光是按照考点的考察频率去刷题,还根据每个大厂的不同喜好去刷。
比如像这样,有针对性的去刷企业题库,我就不信上不了岸。
编辑切换为居中
添加图片注释,不超过 140 字(可选)
分享几道我之前在lintcode上刷过的题,大家也可以来练练手:
804 · 不同岛屿的数量II 294 · 简化链表 549 · 最常使用的k个单词(Map Reduce) 660 · 用Read4从文件中读取N个字符 II-多次调用 734 · 形式为a^i b^j c^k的子序列数量 1076 · 两字符串ASCII的最小删除和
现在刷题可以给我带来很大的成就感,希望大家也能找到编程学习的正确方法论,快速进阶为高水平的大佬!!
码字不易,麻烦给个赞吧。