《剑指offer-名企面试官精讲典型编程题》读后感
首先,不得不说这是一本好书!!!
我接触这本书是在学长的推荐下去看的,而且口碑还是挺好的一本书,豆瓣的评分也比较高,当我刚看了它,我就深深的爱上了这本书,到现在为止,我已经看了三遍这本书了,平时无聊时侯也会拿这本书来翻翻。还有就是做一般的算法题,没有思路的时候,我也会翻开这本书来寻找一些解题思路。我喜欢书中一针见血地的解析,对于解题的点可谓是抓的狠准稳,很容易为读者所理解,不像有的书,大话连篇,最后也就是那么一句话完事了。
这本书虽说是面向软件行业求职者写的,非常适合求职者去读,此外我觉得也非常适合正在学习算法、数据结构的人去读,也算是提前为求职面试做准备吧。而且我觉得这本书不应该被作为求职者临时抱佛脚去读的书,要是那样的话就有点糟蹋了这本书了。
作者何海涛在本书中非常详细地剖析了50多个经典的面试题,那个纪念版的好像新增了20多个,那么中共就有70多个面试题,知识面涵盖软件行业的大部分知识点。从基础知识、代码质量、解题思路、优化效率、和综合能力等五方面系统的整理了影响面试的要点。当然对于面临求职还远的读者可以跳过第一章关于面试的一些介绍,但是我觉得还是要看一下,未雨绸缪,早作准备吧。
下面说说我读这本书的一些收获和感想吧。
首先,我觉得说或最大的就是本书给我指定了一个方向。关于面试、基础知识、代码质量、解题思路、性能优化等等一些方面的知识方向,我该去学习什么东西,怎么去学。当然这本书没有全部的只是内容都写进来,而是进行了高度浓缩,把精华部分呈现给读者,留给读者举一反三的机会。
在基础知识方面,作者推荐我们至少要熟悉一门编程语言,因为算法总是要基于编程语言来实现。对于算法题我个人觉得最适合的语言莫过于C/C++,像用C#或者Java做算法题我总觉得有些别扭,感觉效率也没有C/C++高,代码易读性、可读性也没有那么高(以上只是个人观点)。本书总提到了一些关于编程语言的一些基础概念性的问题。比如在C++中,有哪4个与类型转换有关的关键字?(答案static_cast、const_cast、dynamic_cast、reinterpret_cast)这样我们知道了这4个关键字,但是你会甘心只知道这几个关键字吗?当然还会想知道这几个关键字它的用法是什么,又有什么特点。还有一些题目是要对这一门语言非常了解才能解答的,不然就有可能掉进陷进里面,比如:“定义一个空的类型,里面没有任何成员函数和成员变量,对该类型求sizeof,得到的结果是多少?”,如果没有丰厚的基础知识,可能我们就会回答是0。但是答案是由编译器决定( Visual Studio 中每个空类型的实例占 1字节的空间)。为什么呢?空类型的实例中不包含任何信息,本来求得是0 。但是当我们声明该类型实例的时候,他必须在内存中占有一定的空间,否则无法使用这些实例。然后这个问题在深入一点,”如果在该类型中添加一个构造函数和析构函数,在对 该类型求sizeof,得到的结果又是多少?“,然后再再深入一点,“如果把析构函数标记为虚函数呢?”,要准确得出这些答案就得考查我们深厚的内力了。其实,我还是蛮喜欢这样写书风格的,层层深入,很能考查读者对某个知识点的掌握程度,然后再跟着作者再往前走一走,这样读者的提高就很快(个人感觉)。本书还有很多地方都是采用这种层层深入的写法写的。我印象比较深刻的就是实现singleton模式,作者首先给出了我们一般人都知道的写法(私有化构造函数,然后通过共有函数返回对象),接着就分析了这种大众化的写法有什么缺点,缺点就是单线程下可以运行,但是在多线程下可能就会出现问题了,那么知道了问题所在当然就得去解决,接着就出来了优化后的第一个版本,加判断加锁实现同步,就解决了多线程问题。多线程问题解决了,由于加锁很耗性能,我们能否尽可能地减少加锁的次数呢。那么优化版本二出来了,就是采用双判断,只有真正的没有创建对象的时候我们才去加锁并创建对象。接着思考还有没有更好的办法实现既不用加锁也能保证单例呢?当然有利用C#的静态构造函数只调用一次的特性岂不是更好。到这里singleton已经出来4个版本了。C#的静态构造函数的调用时间比较早,不能实现按需创建实例,所以又有了一个优化的方向,那就是实现按需创建实例。所以lingleton就有了5种实现的方法,至于孰优孰略读者心中也有了定论。
除了基础知识方面,本书还有关于数据结构方面的知识。我以前对链表,树,二叉树,二叉搜索树,图什么的都不是很了解,删除节点,插入节点,遍历的都不是理解得很透。以及这些数据结构的一些特性,该用于什么场合,看了这本书的一些面试题和答案解析及拓展都收获很大。比如说,链表方面的,从尾到头打印链表,反转链表,复杂链表等等的问题,咋一看我都懂啊。其实我也是这样的,但是再看看自己的实现方法的时间复杂度和空间复杂度有事多少呢,这本书的有事多少呢。树方面的,重建二叉树,树的镜像,从上往下逐层打印二叉树,二叉树的平衡等等很多问题,我们有些懂有些不懂,本书都给我们分析得很到位(个人感觉)。基于本书的分析,我们还可以此类推,举一反三,我们平时觉得很难的算法题,好像也没有那么毫无头绪了,至少我们知道往哪方面去思考这些问题了。
还有本书还介绍了一些关于位操作方面的东西。对于位操作我们都知道位操作是高效的,但是我们平时好像都会去忽略了他,或者不想这一方面去思考问题。我看完这本书之后我会有意识无意识的往这方面思考。一个整数执行除2操作和一个整数向右移一位实现的功能是一样的,那么谁的效率会更高呢?对于除以2的整数次幂的操作,我们都可以用左右移位操作来代替。还有很多问题,想考虑使用二进制做掩码,可以高效解决很多问题。
罗里吧嗦地就说了这么多,我就是觉得这是本好书,然后不说点什么感觉有点不舒服,,,,
《剑指offer-名企面试官精讲典型编程题》读后感的更多相关文章
- 《DevOps软件架构师行动指南》读后感
从软件架构师视角讲解了引入DevOps实践所需要拥有的技术能力,涵盖运维.部署流水线.监控.安全与审计以及质量关注,这是本书一开始内容简介的开头,本书的作者是伦恩·拜斯(Len Bass).英戈·韦伯 ...
- nodejs开发指南读后感
nodejs开发指南读后感 阅读目录 使用nodejs创建http服务器; supervisor的使用及nodejs常见的调式代码命令了解; 了解Node核心模块; ejs模板引擎 Express 理 ...
- DevOps:软件架构师行动指南(文摘)
第一部分 背景 第1章 DevOps是什么 第二部分 部署流水线 第三部分 横切关注点 第四部分 案例研究 第五部分 走向未来
- 2020年DevOps工程师入门指南
DevOps兴起于2010年代,到现在DevOps已经在行业中拥有了一席之地,并在继续发展壮大. 有兴趣成为一名DevOps工程师吗?如果想要成为一名DevOps工程师,需要做到以下五点: 要有开发者 ...
- 5月29日 Java性能调优指南 读后感
并行垃圾收集器 串行垃圾收集器 并发标记清除(CMS)垃圾收集器 Garbage First(G1)垃圾收集器 没有深入的学习G1的原理,只是看了大概的思想; SA工具:待学习
- 敏捷开发、DevOps相关书籍——书单
自己瞎整理的一些书单,都是豆瓣评分比较高的书,可以作为选择的一个参考. 书名 豆瓣链接 持续交付:发布可靠软件的系统方法 https://book.douban.com/subject/6862062 ...
- 有奖试读—Windows PowerShell实战指南(第2版)
为什么要学PowerShell? Windows用户都已习惯于使用图形化界面去完成工作,因为GUI总能轻易地实现很多功能,并且不需要记住很多命令.使得短时间学会一种工具成为可能. 但是不幸的是,GUI ...
- [转载]你所不了解的DevOps
DevOps开发运维训练营 一旦建立了创新的文化,即使那些并非科学家或者工程师的人——诗人.演员.记者——也能以团体的形式,接受科学文化的意义.他们信奉创新文化的概念.他们以促进这种文化的方式投票.他 ...
- 给 DevOps 初学者的入门指南
当我们谈到 DevOps 时,可能讨论的是:流程和管理,运维和自动化,架构和服务,以及文化和组织等等概念.那么,到底什么是"DevOps"呢? 什么是DevOps 随着软件发布迭代 ...
- CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...
随机推荐
- ITERATOR(迭代器)设计模式
1 意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 2 别名(Cursor) 3 动机:队列表的访问和遍历从列表对象中分离出来放入一个迭代器对象中. 多态迭代 ...
- LayoutParams使用
LayoutParams继承于Android.View.ViewGroup.LayoutParams. LayoutParams相当于一个Layout的信息包,它封装了Layout的位置. ...
- Selenium Grid Configuration
Start Hub and Node with Json config 1. Start Hub with json config file title HubWebDriver java -jar ...
- ADO
目 录 第1章 基础 1 1.1 引入ADO库文件 1 1.1.1 版本 1 1.2 初始化OLE/COM库环境 2 1.3 comdef.h 2 1.3.1 字符串编码 ...
- CentOS中yum安装软件时报错:No package XXX available
yum 安装软件时,报错:No package XXX available. [root@localhost ~]# yum -y install redis Loaded plugins: fast ...
- 工程目录 Java/Web/Maven
jar包和war包的区别 war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运 ...
- hdu--(1025)Constructing Roads In JGShining's Kingdom(dp/LIS+二分)
Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- javaSE之如何将一个文档显示出来(,txt,.doc,.....)
package DEMO ; import java.io.File; import java.io.FileInputStream; import java.io.IOException; impo ...
- Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- Android开发--TextView的应用
1.概述 TextView主要用于Activity中文本的应用.其中layout中xml文件(activity)设置文本的宽度,高度,ID:values中strings.xml设置文本内容. Text ...