《剑指Offer》读书笔记 第三~六章

在这里插入图片描述

3.2 代码规范性

书写:
布局:
命名:
笔者之前工作中参考匈牙利命名法以及谷歌C++格式参考

3.3 代码完整性

1.功能测试:任意合法输入应该满足所需功能
测试手段:①、常规测试②、输入数据按边界测试
2.边界测试:代码中任意边界不会越界
测试手段:①、循环/递归边界②、顺序容器边界③、类型边界
3.负面测试:任意非法输入应该被拒绝或防御
测试手段:①、错误类型②、类型下非法数据(经典空类型)

☆主动提醒面试官代码中的细节
①、优化效率时②、做出选择时(例如i++)

☆代码扩展性
将核心代码中的一部分以函数指针的形式实现,来提供可扩展性。

3.4 代码的健壮性

在Coding之后,多思考:“如果不…那么…”

4.2 画图

解决复杂问题时,画图帮助自己理解

4.3 举例

用于Coding前的分析题意与Coding后的测试代码。将实现过程具体化,越具体越好,越具体越有利于分析。仅仅是大脑中模拟,纸笔简化是不够的。有时候甚至需要列表等操作来细化过程方便分析。

4.4 分解

①分治法
②面向接口编程
一个复杂接口可以分解为几个小接口,致力于小接口的实现来简洁地实现复杂接口。
③递归
④动态规划

动态规划

笔者认为动态规划与递归正是相反的两个解决问题的思路方向。递归是逐层递归,直到解决最深层的问题,向前思考。动态规划则是默认前面已经全部解决好了,只需要解决眼下的问题。向后思考
动态规划的基本步骤
①写出关系式
②关系式代码化
③设置变量保存需要输出的结果

5.2 时间效率

经典增加时间效率的做法:

①引用传值
②循环VS递归
③经典算法的取舍

☆面试时,有想法就要说出来(展现思维敏捷),要主动提出更优化的想法(展现追求完美)

某些问题的特殊解法

求数组中出现最多的数字

每个与上一个数字比较,同则++,不同则–

数组中第k大的数字

使用一次QSort()

字符串比大小

不一定非要按字典序排大小,cmp函数是可以自定的

幂次问题【丑数】

While循环+利用数学特性,通过map存储已知的求未知

逆序对

归并排序

链表公共结点

①两个链表比长短,长的先走几步
②双指针对撞相遇

针对已排序数组

①二分查找
②首尾双指针

☆解答问题前,要思考
①数据量有多大
②能否一次性载入内存
③是否允许交换输入数据中数字的顺序

有时候需要牺牲时间复杂度来应对和解决现实生活中的现实需求

6.2 沟通能力与学习能力

沟通

逻辑清晰明了,语言详略得当,表述重点突出,观点明确。知之为知之不知为不知。

学习

①最近看什么书
②最近做什么项目
③从中学习到哪些新技术
④面试过程中对提出的新概念的较快理解

6.3 知识迁移能力

简单的问题的解决可能只是为了解决复杂问题

6.4 抽象建模能力

①选择合理的数据结构
②分析模型的内在规律
③将内在规律代码化

6.5发散思维能力

常规思路遇到阻碍时,灵活变通,但需要很深厚的知识储备

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值