《剑指 offer》读书笔记【七日打卡】

320 阅读7分钟

@《剑指 offer》读书笔记

create by db on 2021-1-12 12:30:24
Recently revised in 2021-1-12 14:46:35

闲时要有吃紧的心思,忙时要有悠闲的趣味

目录

前言

返回目录

 《剑指 offer》是 618 屯的书,本着买了就是看了的心态一直在暑假上吃灰。前些天终于在掘金打卡的激励下,把这本中级算法书啃完了。。。虽然看了也不怎么懂,但是开卷有益,读了之后还是有些收获。在此分享给大家。

主观评价

返回目录

 《剑指 offer》是一本算法经典畅销书,想必大家或多或少听过或是看过。

 作为一个前端程序员,我的入门算法书是《漫画算法》,《剑指 offer》是用来做进阶书看的,本来备选还有《算法(第五版)》。参考了一些大佬的书评,本着柿子捡软的捏的想法,还是选择这本《剑指 offer》——不过对于我这个算法菜鸡来说,这也不是个软柿子……

优点

 作者从自身经历出发,从面试流程入手,逐步讲解了数据结构及算法知识,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这 5 个面试要点。由此引出了六十多道面试题,后面还有两个是面试案例。这对于初入职场的新人来说,有着不错的指导效用。

 其中很多面试题非常经典,如斐波那契数列,二叉树遍历、链表等,涵盖内容比较全面,过程讲解细致,书上有源码可以直接看,而且有的一个题会由浅入深有多个解法,是比较友好的一本算法书。

缺点

 首先要吐槽的是这本书是 C++ 写的——虽说语言都是相通的,但平时只用 JavaScript 的我看起来真的很费劲。

 其次是题量不够多,其实算法这个东西,有时间看书真不如去刷力扣或者牛客网。

适合人群:

 本书比较适合有一些算法基础及编程语言基础的同学来,用来巩固算法知识,或者用来做算法面试准备。

 而我作为一只前端菜鸟,以往的面试过程也没碰到过几个像样的算法题(多数就是排序的实现,深克隆,字符串之类),不敢确定上面的题目面试会不会碰到。不过技多不压身,多储备点知识还是不错的。

推荐指数:★★★★

内容笔记

算法题主要分成数据结构和具体算法部分,简单归类如下。基本每道题都不错。

数据结构类题目

LinkedList

  • 003-从尾到头打印链表
  • 014-链表中倒数第 k 个结点
  • 015-反转链表
  • 016-合并两个或 k 个有序链表
  • 025-复杂链表的复制
  • 036-两个链表的第一个公共结点
  • 055-链表中环的入口结点
  • 056-删除链表中重复的结点

Tree

  • 004-重建二叉树
  • 017-树的子结构
  • 018-二叉树的镜像
  • 022-从上往下打印二叉树
  • 023-二叉搜索树的后序遍历序列
  • 024-二叉树中和为某一值的路径
  • 026-二叉搜索树与双向链表
  • 038-二叉树的深度
  • 039-平衡二叉树
  • 057-二叉树的下一个结点
  • 058-对称的二叉树
  • 059-按之字形顺序打印二叉树
  • 060-把二叉树打印成多行
  • 061-序列化二叉树
  • 062-二叉搜索树的第 k 个结点

Stack & Queue

  • 005-用两个栈实现队列
  • 020-包含 min 函数的栈
  • 021-栈的压入、弹出序列
  • 044-翻转单词顺序列(栈)
  • 064-滑动窗口的最大值(双端队列)

Heap

  • 029-最小的 K 个数

Hash Table

  • 034-第一个只出现一次的字符 图
  • 065-矩阵中的路径(BFS)
  • 066-机器人的运动范围(DFS)

具体算法类题目

斐波那契数列

  • 007-斐波拉契数列
  • 008-跳台阶
  • 009-变态跳台阶
  • 010-矩形覆盖

搜索算法

  • 001-二维数组查找
  • 006-旋转数组的最小数字(二分查找)
  • 037-数字在排序数组中出现的次数(二分查找)

全排列

  • 027-字符串的排列

动态规划

  • 030-连续子数组的最大和
  • 052-正则表达式匹配(我用的暴力)

回溯

  • 065-矩阵中的路径(BFS)
  • 066-机器人的运动范围(DFS)

排序

  • 035-数组中的逆序对(归并排序)
  • 029-最小的 K 个数(堆排序)
  • 029-最小的 K 个数(快速排序)

位运算

  • 011-二进制中 1 的个数
  • 012-数值的整数次方
  • 040-数组中只出现一次的数字

其他算法

  • 002-替换空格
  • 013-调整数组顺序使奇数位于偶数前面
  • 028-数组中出现次数超过一半的数字
  • 031-整数中 1 出现的次数(从 1 到 n 整数中 1 出现的次数)
  • 032-把数组排成最小的数
  • 033-丑数
  • 041-和为 S 的连续正数序列(滑动窗口思想)
  • 042-和为 S 的两个数字(双指针思想)
  • 043-左旋转字符串(矩阵翻转)
  • 046-孩子们的游戏-圆圈中最后剩下的数(约瑟夫环)
  • 051-构建乘积数组

个人心得

返回目录

 算法这个东西真不能指着一两本书就完全理解,还得靠平时自己的积累。

 在浩瀚如烟的题目面前,死记答案根本没什么用。我们能做的就是了解原理,举一反三,最重要的就是多做题了。所谓孰能生巧,多做题,多复盘

 顺便推荐两个算法题库:

 对于刷题,我也没有特别好的方法。借用下大佬的建议:

剑指offer -> Leetcode动态规划->面试前再过一遍剑指offer

  • 每个人基础不一样,不过我觉得刷题还是要全职专项的刷。

  • 有个重要的点是:每道题做完一定要去讨论区!

  • 讨论区有非常精简的大神级代码,你好不容易 AC 了一道题准备去讨论区吹(装)水(逼),点开一看,“握草,还可以这样”。

  • 思考为什么他可以写出这么好的代码,把每道题的思路理解后用笔记本记录下来,争取刷到融会贯通,即看见有个题能自动归类到某个方面,这样有一定好处。面试最重要的是让面试官日后能愿意与你以后一起工作,因此沟通交流非常重要。比如有时候面试需要交流,看着像是一道排序的题做不出来,就可以跟面试官交流:“我有几个不成熟的想法,一排序,二动态规划,三是直接搜索算法”,面试官可能就给个提示:“你先用排序试试吧“。

 最后感谢作者,向前辈学习,加油!

总结

返回目录

 路漫漫其修远兮,与诸君共勉。

后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址

文档协议

知识共享许可协议
db 的文档库db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/danygitgit上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。