那些编程水平很高的程序员是怎么训练出来的?

我有一个想法,不一定对

我觉得高水平的程序员是可以速成的。

目前的自己也算是个高水平的程序员吧,一口气拿下了字节、阿里、百度三家公司的offer。

当我还是一名普通的程序员的时候,我认为成为大神需要两个阶段:

阶段一:从普通程序猿成为熟练开发者

阶段二:从熟练开发者成为资深架构师

第一阶段需要你的专项的技术能力,第二阶段需要你成熟的技术体系。完成这两步,也许我们可以离大神更进一步。

不知道你有没有遇到过这种情况,明明刷了400-500道题,都快刷吐了,也没啥成效。而隔壁大佬随便刷个几十道都能进大厂。这就是很典型的例子。

成为高水平的程序员,重点不在于“训练”,而在于学习方法有捷径。找对了学习方法,速成就不是问题。

我自己就是个典型,当初找工作的时候口号喊得可响了,要笨鸟先飞!然后天天给自己搞题海战术,也不复盘,也不总结。面试不知道翻车多少回。

回想起当时的境况,我真的觉得自己是个傻*。直到我室友,像关爱智障一样的,给了我一套算法小抄。仿佛打开了提升算法技能的开关,天知道我当时有多感谢他...

这份算法小抄里包括了大厂面试中常考的算法及数据结构。像什么二分法、双指针、排序算法等等。还举例了常考题的解题思路和模板。是真的香!分享给跟我一样渴望成为编程大佬的同学!!

编辑切换为居中

添加图片注释,不超过 140 字(可选)

而且,这套小抄的神奇之处在于:他套上模板就能使用。

拿一道面试常考的双指针来举例:

使用条件

滑动窗口(90%) 时间复杂度 O(n) (80%是双指针) 要求原地操作,只可以使用交换,不能使用额外空间(80%) 有子数组 subarray / 字符串 substring 的关键词 (50%) 有回文 Palindrome 关键词(50%)

复杂度

时间复杂度: O(n)

时间复杂度与最内层循环主体的执行次数有关 与有多少重循环无关

空间复杂度: O(1)

只需要分配两个指针的额外内存

★实战阶段

Lintcode例题

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的最小删除和

现在刷题可以给我带来很大的成就感,希望大家也能找到编程学习的正确方法论,快速进阶为高水平的大佬!!

码字不易,麻烦给个赞吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值