剑指offer读书笔记
JackZhangNJU
未来的路还很长
展开
-
剑指offer读书笔记:第二章,面试基本知识01
问题01 C++拷贝构造函数 答案选择A。因为C++要求复制构造函数不允许使用值传递来传递参数,否者会出现无限调用复制构造函数的情况。问题02 运算符重载就是考察等号运算符的重载,这个其实考察这几点:函数的参数是否是const引用。否者的话会增加额外开销函数的返回值是否是引用方式,同时要把当前对象返回是否释放自己的内存假如传入对象和自己式样的应该怎么办。 ...原创 2018-03-08 19:48:23 · 262 阅读 · 0 评论 -
剑指offer读书笔记:第二章,面试基本知识02
问题1 有序矩阵+右上角查找方法有二暴力查找右上角查找问题变形:寻找第k小的数据方法有二 - 暴力遍历然后排序 - 右上角查找+二分查找参考这个链接leetcode 668. Kth Smallest Number in Multiplication Table 有序矩阵搜索 + 右上角二分搜索 问题02 字符串地址 str1和str2会自...原创 2018-03-08 20:47:06 · 289 阅读 · 0 评论 -
剑指offer读书笔记:第二章,面试基本知识03
问题01 排序算法 && 旋转数组 上面的做法是基于统计来实现排序。 很明显最直接的方法就是暴力遍历,复杂度是O(n),但是这显然不是面试官想要的做法,这明显是考察二分查找。可以看出每次根据low和high求出mid后,mid左边([low, mid])和右边([mid, high])至少一个是有序的。这个才是解决本问题的关键的地方,那么可以得到如下的流程:...原创 2018-03-09 14:32:10 · 260 阅读 · 0 评论 -
剑指offer读书笔记:第三章,高质量的代码
问题01 代码的全面性在写代码的时候要注意各种情况的考虑,一般分为三个方面:功能测试:这个主要测试可以不可以完成函数的功能,边界测试:这个尽量要考虑各种极端的case,比如循环条件的边界判断、数据溢出的考虑等等负面测试:这个主要是各种错误的输入,靠考虑系统的鲁棒性,比如指针为null应该怎么考虑,等等。 - 问题02 数值的整数次方 对于这道题,要考虑四种情...原创 2018-03-09 16:08:24 · 293 阅读 · 0 评论 -
剑指offer读书笔记:第四章,解决面试题的思路01
问题01 二叉树的镜像–>反转二叉树 这个就是著名的反转二叉树问题void exchangeBTree(BTRee *root){ BTRee *t; if(root) { t=root->rChild; root->rChild=root->lChild; root->l...原创 2018-03-09 16:58:15 · 294 阅读 · 0 评论 -
剑指offer读书笔记:第四章,解决面试题的思路02
问题01 二叉树中和为某一值的路径 直接DFS深度优先遍历即可问题02 复杂链表的复制 方法1是通过链表查找来得到pSibling指针所指向的结点,实际上我们可以通过空间换取时间,将原始链表和复制链表的结点通过哈希表对应起来,这样查找的时间就从O(N)变为O(1)。具体如下:复制原始链表上的每个结点N创建N’,然后把这些创建出来的结点用pNext连接起来。同时把问题0...原创 2018-03-09 17:45:51 · 305 阅读 · 0 评论 -
剑指offer读书笔记:第五章,优化时间和空间效率
问题01 数组中出现次数超过一半的数字 对于一个数组超过一半的数字就是众数,直接摩尔投票方法,其他的方法都是渣渣。参考这个博客找出数组中出现次数超过一半的数+ 寻找众数 + 摩尔投票法 问题02 最小的k个数 这道题和求第k小的数的做法是一样的,直接快排的思想去做即可。其实还可以这么做 问题03 连续子数组的最大和 典型的动态规划DP...原创 2018-03-09 20:42:17 · 668 阅读 · 0 评论 -
剑指offer读书笔记:第六章,面试中的各项个能力01
问题01 数字在排序数字中的数量 最笨的方法使用Map统计遍历,但是题目是有序数组,所以必然是二分查找,可以去寻找key的上一个元素和下一个元素,时间都是O(lon(n)),然后计算范围即可。问题02 二叉树的深度这个实在是太简单了,直接DFS深度优先遍历即可问题03 数组中只出现一次的数字 先考虑一个数组里只有一个数出现一次,其他两个数都出现两...原创 2018-03-09 21:42:36 · 290 阅读 · 0 评论 -
剑指offer读书笔记:第六章,面试中的各项个能力02
问题01 N个骰子的点数 基于递归求骰子点数,时间效率不够高。先把骰子分成两堆,第一堆只有一个,第二堆有n-1个,单独的那一个可能出现1到6的点数,我们需要计算从1-6的每一种点数和剩下的n-1个骰子来计算点数和。还是把n-1个那部分分成两堆,上一轮的单独骰子点数和这一轮的单独骰子点数相加,然后再和剩下的n-2个骰子来计算点数和。不难发现这是一种递归的思路。定义一个长度为6n-...原创 2018-03-10 14:28:53 · 346 阅读 · 0 评论