前言
上学的时候学过c语言课程,工作以后干过一年的C语言白盒测试,最近为了找工作自学了python(题外话code with mosh的课真心优秀),这就是之前我跟代码的所有关系了。当知道新的工作机会需要机考算法时,有点懵了,硬着头皮打开传说中的力扣,经典第一题“两数之和”看完题目后,只想问一句我是谁我在哪。。。。最终小破站搜索解决方案的时候找到了代码随想录的视频,真心适合我这种算法小白,视频思路讲解细致,网站上还有文本也方便自己过后对照整理思路和逻辑,义无反顾的上船了训练营。昨天完整刷完一遍了,今天整理总结一下吧。
就按照代码随想录的流程,整理一下各个章节的学习内容吧
1.数组
通过这个部分,慢慢入门熟悉算法题,提升对代码的掌控能力。从看代码慢慢进入写代码。不过刚开始学的时候,每一个解法,都是新的脑细胞啊。
2.链表
链表的知识以前上学好像学过一点,了解是什么,但是要自己掌控,的确又是一系列新知识。node.next 和node.next.next可是混乱了好长时间。707题设计链表真的是掌握链表的好题,一点点写出代码各个功能函数,运行出错,debug一点点找问题,最后还写了个打印链表的的函数来遍历输出找问题。不过现在一想细节好像又有点模糊了,对小白来说真的要多复习。
3.哈希表
由于刚开始看了《算法图解》这本书,习惯性的用字典去存储数据散列表,后面才发现很多时候直接用列表存储效率会高很多。当然时间复杂度空间复杂度这些知识,一开始的确是没有的,现在也只是大概理解,继续加油。
还有一点随想录上的知识都是针对C++来讲的,用python学习不太能对照理解,还好现在有AI了,有什么问题,整理清楚让AI给对照讲一下python 的知识会方便很多。不过有的知识AI也不能那么智能的去讲解,有的知识也不是能一一对照的,如果基础知识部分有不同语言版本的就更好了。
4.字符串
也算是基础补齐的一个章节。之前自学python,基本也就是学个语法基础知识,在做题的时候,发现很多常用的函数都没用过。
也有难的部分,kmp算法刷了两遍,二刷的时候感觉终于是懂了,但是现在让我讲一下具体的写法,还是说不出来。。。。等着三刷四刷吧。
5.栈与队列
说实话,以前一直听说堆栈堆栈,但是也仅限以前考试时知道的先进后出和先进先出。这部分刷了两遍,第一遍的时候只是说知道了原来栈是的实现是这样的;第二遍的时候,加上一刷后面的单调栈部分的锻炼,才理清栈的知识和栈在python中的实现。二刷239. 滑动窗口最大值这道题的时候,才完全理清楚。刚开始看的是append、popleft、前端、尾端、首端、末端、左侧、右侧,他们是要怎么对应啊?各种说法真的是看的眼花头大。
6.二叉树
当年学C语言的时候,就听说过二叉树的大名。不过久闻其名未见其人,这次学算法终于是知道什么的二叉树了。从二叉树的前中后序遍历,到各种奇诡的在二叉树上求各种值进行各种操作,现在一提想不起细节了只觉得头大,哈哈,不过感觉通过二叉树章节慢慢理解学习了递归的知识,对后面回溯、动态规划的学习理解有很大帮助。
7.回溯算法
在经历完二叉树的考验,理解学习递归知识后,进入回溯算法章节好像没有那么的难了。但是本章节后面的算法题,除了回溯的用法,还需要很多别的思路和代码功能储备,还是很难啊,等待下一刷吧。
8.贪心算法
贪心,理论基础貌似很简单,就是找最优解然后扩大它。但是,遇见不同的题就有不同的套路,需要强大储备题库才能具体操作。过一段时间好像又会忘记,还是基础薄弱要加强啊。
9.动态规划
随想录学习过程中一大硬啃章节(当然后面才发现图论才是大boss),还好这部分前面跳着赶进度的时候,多刷了一遍,刷第二遍的时候,才真的理解了。一刷的时候就是看题不会,然后就去看卡哥视频,看完还是模模糊糊,跟着题解代码一个个抄下来,似懂非懂的往后推进。
二刷的时候已经有了大概框架知识,再慢慢 按背包、股票、子序列系列整理,对比题目要求的改变,以及代码做出的改动,提炼出区别处进行对比,对dp[i][j]的定义和递推公式有个更深的理解,对代码理解和掌控能力有很大的提升。
10.单调栈
单调栈这个章节一刷的时候也是懵的,但是在回过头二刷做栈与队列239. 滑动窗口最大值这道题时,突然理解了栈的“单调”逻辑,也理顺了栈顶栈底这些概率,二刷单调栈部分终于不晕了。
11.图论
如果说前面章节的知识,对于没有学习过数据结构和算法的我来说,是新的知识,但多多少少还是接触过一些的或者说用已有的语法知识能扩展联系上,那么图论就是嗷嗷新嘎嘎亮新的不能再新的知识。话说之前我一直以为图论是状态机转换图相关的东西,谁知道一上来连存储数据的邻接表和邻接矩阵都需要理解需要学习。。。
本章前半程好不容易理解了,后半程又来个并查集,再次重现我是谁我在哪的画面。然后这一章也没有对应的视频,真的就只能硬学,文字讲解反复看,“大概”理解了以后,去一句句抄题解代码,抄的过程中发现一部分理解的错漏,后面代码提交不通过,反复对照题解代码或者找AI检查,又发现部分理解错误或者遗漏。这里真的要感谢AI的存在,各种问题都能问不用怕问题太小白了不好意思,然后还能把自己的理解梳理出来,让AI判断一下自己的理解是否准确,不准确的地方让AI进一步讲解。理解疑惑的地方还能问问AI具体这个判断条件有什么用。
学完这一章,发现这才是算法的星辰大海,一刷理解的勉勉强强,后面考完试,有空再来二刷吧。
总结
训练营跟到第十天的时候,由于急着去机考,就暂时先跳过了二叉树章节后面部分,继续往后刷了。相当于提前一刷了后面的回溯、贪心和动态规划,虽然啃的有点头大,但配合卡哥视频能勉强“似懂非懂”往后推进。简略跳着刷完一个流程以后,去做了机考真题,结果还是有点头大,看了题解代码能明白,但是要自己写还是没思路,还是回来二刷吧。
在后面二刷的过程中看到了进步,简单的题自己能有思路了,难的题一般去看看网站文字讲解也能分析出解法逻辑写出代码,实在复杂的才需要继续看视频。跟一开始看着“两数之和”完全没有方向的状态相比,已经进步很多了。不过在后面的学习中也发现自己还是有很多不足的地方,需要继续学习和拓展相关知识。特别是图论后面几个算法,一刷完还是懵的,亟待二刷三刷。
跳着完成一刷和部分二刷,特别是二刷时再去做题,不再是脑袋空空无从下手的感觉了,感受到了真实的进步。从一个脱离工作几年的测试人员,到能看懂复杂代码,写出一些稍稍微复杂的代码。虽然写出的代码稍显幼稚混乱,但是也是之前的自己不敢像,我居然也能写代码啦,哈哈。虽然还有很多不足,还有很多要学习的的内容,但是短暂总结这两个月的学习,完成了,做到了,继续加油!