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… 处获得。