我在“第四份作业,刷题”中收拾过自己的刷题经历:我从前屡次测验过刷题,每次刷题都因为“标题太难我太懒”停下来。

大概是前年,一面字节成都,算法标题为“二叉树的右视角”,其时表现是窘迫的,我对这标题(二叉树,一直是我技术点的生疏处)毫无思路,成果当然是没成果。

所以,要找一份自己满意作业,要进大厂,又似乎不得不刷题。刷题需求从每天的业余时刻中抽出一部分来考虑来举动,需求战胜自己的懒惰与疲惫,这是一件很难的事……

后来养成阅览习气,我测验一种新的折中的“刷题方式”:从每天的阅览时刻中抽出精力较好部分用来看一本专门讲算法标题的书。

选书,是简单的,有好几位大佬收拾出好几本专为刷题的书。我挑选的是何海涛老师的《剑指Offer(专项打破版):数据结构与算法名企面试题精讲》。

这本书一共21万字,我花15小时过完一遍。

这本书分作15个章节,前面10个章节和最末章节别离介绍一种数据结构,并选出许多与该数据结构相关联的算法标题进行解说;第11到14章则为几种算法的详解。这些章节别离是:

  • 整数,首要知识点是整数的内存占用长度和整数的二进制运算;
  • 数组,处理数组标题的一种常用思路是双指针,从两端往中间靠或是一快一慢;数组中元素求和,是常见的标题;二维数组乃至多维数组,也是可能出现的;
  • 字符串,本质上也是一种数组,不过变化更多,变位词或是回文常出现;固定巨细(26个字符)的哈希表和双指针,是常用解法的小提示;
  • 链表的节点“手牵手”,链表在空间上比数组灵活;哨兵节点可以简化刺进与删去代码的逻辑;到此章节,标题花样开始多起来,回转链表、重排链表、双向链表、循环链表;双指针仍然很有用;
  • 哈希表,刺进、查找和删去一个元素都只需求O(1)的数据结构;哈希函数的挑选,数据磕碰的处理以及哈希表的运用,是常有标题;
  • 栈,“后入先出”,许多算法依赖栈的运用;
  • 行列,“先入先出”,即日常生活中的排队,与栈相同,许多算法都运用行列作为辅佐数据结构;二叉树的广度优先查找便需求行列的协助;
  • 树,一种分层的数据结构,二叉树是最常见的树;二叉树的深度优先查找,运用递归实现会很简单;二叉树的深度优先查找有三种方式,中序遍历、前序遍历和后序遍历;二叉查找树的左子节点、根节点和右子节点,是有序的;
  • 堆,是一种特别的树,分为最大堆和最小堆,在最大堆中,每个节点的值总是大于或等于其任意子节点的值;在某个数据集合中找出k个最大值或最小值,常常运用堆;
  • 前缀树,英文单词的存储可以借用前缀树实现,它首要用来处理字符串查找相关问题;
  • 二分查找,关于在排序数组中找答案,二分查找总是值得测验的;
  • 排序,是十分根底、重要的算法;
  • 回溯法,是蛮力法的升级版,集合的组合、摆放核算需求用到回溯法,那种需求若干步骤、每个步骤面对若干选项的问题都可以用回溯法;
  • 动态规划,与回溯法很像,回溯法是列出一切可能成果,而动态规划是从这许多成果中找出最优解;动态规划,总是将大问题拆分为小问题来处理,找出大问题的解和小问题的解之间递归关系的状态转移方程是解题要害;动态规划的标题有许多;
  • 图,有节点有边,图的查找算法也分为广度优先查找或深度优先查找;导航地图中的途径挑选算法,就该是与图有关的;

我的阅览习气基于碎片时刻,每次看这本书,都只会继续十几二十分钟。一道标题,二十分钟内了解不到位,便放到明天再来,明天不可,又推到第三天。就这样地继续阅览,总算花半年读完本书。

收拾本篇读书笔记前,我理过一个小小大纲:开篇指出自己从前没做出来“二叉树的右视角”,中间是全书大概内容以及阅览体验,最末将“二叉树的右视角”默写出来。

默写前一周,我先温习一遍行列章节内容。昨天做题时,总不敢相信自己的代码是正确的,总感觉它有些过于简单,待与书中答案对比,才确认这代码并不算错。

defrightView(tree):
result=[]
if(tree.headisNone):
returnresult
queue1=[tree.head]
queue2=[]
while(len(queue1)!=0):
root=queue1[0]
queue1=queue1[1:]
if(root.leftisnotNone):
queue2.append(root.left)
if(root.rightisnotNone):
queue2.append(root.right)
if(len(queue1)==0):
result.append(root.val)
queue1=queue2
queue2=[]
returnresult

刷题,可真是一件烦恼事。

我的这种折中刷题方式,并不太靠谱,到收拾本篇笔记时,书中许多标题都需求很花心思才干跟着作者思路再走上一遍;乃至很有一些,即便很花心思也走不了一遍。

究竟怎样可以将这些标题真的记住呢?怎样可以不忘掉呢?我知道的一个答案是将这些标题运用到具体事务场景中去,游刃有余永远是最好的学习方式。但作业中,真的需求继续考虑相关问题么?

刷题,可真是一件烦恼事。写这样的读书笔记,也是一件烦恼事,读完一本书,我似乎什么都没学到,又似乎知道了许多。

怎样可以将运用数据结构与算法变得跟骑自行车相同——不必想便能生出天然反应并做出正确挑选——呢?

且待我再找几本书来看。只看书?或许并不太够。