算法——不得不磕!

程序员说未来 2024-08-29 13:14:45

OK,首先一个小问题——你知道国际大厂通用的筛人方法是什么吗?......

只有两个:

①算法 Algorithm

②系统设计 SystemDesign

如果你在美国、加拿大,是应届生想找份工作,那么你其它什么都不用考,单单只考算法就够了。至于你使用的何种语言,Java、Python、C++......Who care? 只要你现场敲代码能把算法写出来,其它不做要求。

现在国内很多大厂也开始和国际接轨了。例如想进华为,那么三道算法题,其中有一道必须是图算法;去字节,四道大算法题(其中动态规划算是很普通的题了)......

一、算法的重要性

问题何在?

市场上很多突击性的课程,只要有人肯学肯背,就能搞定。比如有些基础知识不知道,可以用粗略的方式了解,然后用背题的方式来增加面试的可能性,大概率是可以应付的。

但是,突击解决不了的就是算法和系统设计。

算法讲究的是逻辑,需要你真正地把程序写出来,能够解决这个问题,体现的是逻辑思维能力,而这就需要日积月累的训练。并且,算法某种程度上是超越语言的,当真正了解算法后,就会发现语言、语法都没那么重要。只要掌握任何一种语言了,就可以上手算法了。特别是年轻人,强烈建议,认真把算法学起来。哪怕速度很慢也不要紧,掌握了此程序员的“易筋经”,还要什么自行车。

而系统设计,则侧重学习设计模式、设计思想、DDD、软件工程......另外原理源码的解读则可以帮助你建立起个人的设计思维。

如果你掌握了算法,你也就掌握了投资周期长的能力,同时侧面说明你是一个刻苦的人,并且不会太笨!业务大家都会做,只有掌握了别人无法实现的东西,才能成为不可替代的角色,才是真正的核心竞争力。

二、算法带来的个人价值

推荐算法、最短路算法、最值算法、排序算法、压缩算法、加密算法......生活中有诸多算法。但是,身边不乏有很多“前辈”告诉你——“算法没用,我只在面试的时候用过。”我个人有理由怀疑他危言耸听,或者缺乏自信,再或者误人子弟。

1.抽象问题的能力

多数的算法问题,不会直接告诉你用的是什么样的算法,这就需要通过自己的思维进行抽象,才能把它和自己学过的算法及其相关知识联系起来,抽象的过程就是锻炼思维的过程。

2.解决问题的能力

对于算法题目,一般只有输入和输出,没有任何图形化界面。只要你的输入按照预期进行输出,而不需要去关心UI如何展示,不会有其它杂念和顾虑,而是完全专注于解决问题本身。

3.编码能力

论coding能力的养成,那必然是在练习刷题的过程中不断提升的。不断学习、反复练习、程序的时间效率和空间效率得到提升,代码质量也是在优化的。同时,遇到困难的时候,还能看看别人的代码,理解其思路,茅塞顿开!

4.调试能力

很多人在做算法题的时候,都难免遇到怎么都改不出和测试用例一样的输出,尤其是碰到指针的问题,二叉树或者链表的指针指来指去,晕头转向,完全不知道现在的程序是如何运作的。

推荐三个好用的方法:

①画图

在没有把问题想清楚的情况下,把问题具象化,化抽象为形象。一种高端的艺术能力,能帮助更好地解决问题本质,孰能生巧下必有收获。

②调试

当之无愧的程序员基本素养,能够精确到每一个语句,每一行代码,每一个变量在当前状态下的值。如此一来,就可以判断问题出现在哪一行代码,更好的定位问题,对症下药。

③print大法

推荐给初学者,是最傻瓜式但相对较常用的方式。如果不会调试,就可以选用此种方法。每个变量的值改变后,都把它打印出来看看,以此找出问题所在。

5.测试能力

做算法题的时候,测试用例都过了,但是最后题还是过了的情况,相信很多人都遇到过。那是因为测试用例一般会是大量的,并且考虑到大部分的情况,只要有一组数据失败就算不通过,过程相当严谨。因此,通过实现一个个算法能够帮助养成更严谨的测试习惯,多考虑边界条件,多想想会出问题的点。对日后的工作而言,百利而无一害。

三、常见算法错误

“人非圣贤,孰能无过?”总是难逃一错,哦,不,可能是很多错误......

内存泄漏、栈溢出、死循环、数组越界、整型溢出、初始化问题、边界问题、递归出口、变量二义性,运算符优先级、等幂性等等。(欢迎补充哈~)遇到算法错误,头大得很。通过思考常见错因,能更快地解决问题哦~

四、结语

大环境确实不好,但是如果只知道自怨自艾,那都是徒增烦恼且于事无补的。

回归现实,感觉算法岗好像还是不够接地气,而开发岗则更香。好比有钱途、有未来的AI算法岗,确实往往是大厂才需要。因此,还望诸位结合学历、年龄、能力、城市等因素综合考虑,才能得出最优解!

如果喜欢以上内容的话,可以点赞收藏一下哦~谢谢!!!

最后,祝愿大家一路高歌,扶摇直上~

1 阅读:5

程序员说未来

简介:感谢大家的关注