![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
08 [剑指Offer & 编程珠玑]_笔记
教练、我想打篮球
这个作者很懒,什么都没留下…
展开
-
01 在递增[下面的<上面的, 左边的<右边的]二维数组中查找给定的值
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述满足条件的矩阵 思路书中给出的思路有两种 思路一 : 从第一行开始进行查找, 因为每一行的数据有序, 所以可以使用二分查找, 剪枝条件为给定的数据小于给定行的第一个数字[给定行最小的]思路二 : 从arr[0][col-1]开始查找, arr[0][col-1]的特征为当前行的其他数据都小于该数据, 当前列的其他数据都大于该数据原创 2015-12-28 21:50:42 · 503 阅读 · 0 评论 -
28 找出不存在的数字
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路注意题目中的限制, 40亿个32位的数字, 并且只有上百字节的内存, 但是 这里有充足的临时文件空间 因为 输入数据太大, 所以 只能够将数据处理后存储在临时文件, 然后在进行处理思路 : 对于这样一个文件, 40亿个数字 即使使用BitSet, 仍然需要使用4595.01M的空间, 所以 需要多次读取该输入文件, 将各个ra原创 2016-01-23 10:21:37 · 2558 阅读 · 0 评论 -
29 同位词的统计
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路同位词 : 如果一个单词可以通过交换任意字符的位置进行重新组合 得到另外一个单词, 那么 这两个单词互为同位词思路 : 对于该问题, 我们可以发现每一组同位词有一个相同的地方, 组成他们的字符的字符大小, 字符个数 都相同, 这就是 我们的突破口, 我们可以为每一个单词定义一个label, 该label为该字符串中的所有字符进行原创 2016-01-23 20:33:14 · 664 阅读 · 0 评论 -
30 从n个数中随机获取m个数字
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述从给定的n个数中随机抽取m个数字 不知道 这道题目属不属于”编程珠玑”中的, 我找了一下 似乎没有找到思路思路一 : 总共需要找到m个数字, 找第一个数字 : 生成一个[0, n)的随机数k 获取该位置的数据; 找第二个数字 : 生成一个[0, n-1)的随机数k2, 那么 这时候就应该排除第一次找到的k对不对, so 如果k2>原创 2016-01-24 20:44:51 · 3116 阅读 · 0 评论 -
10 归并两个有序链表
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述 现在有两个有序链表的头结点, 试图将两个链表归并到一个链表中, 是一道 很常见的一道题目思路两种思路, 一种基于循环, 一种基于递归, 后者简洁的多思路一 : 首先判断两个链表的第一个结点的大小 确定头结点, 然后利用一个循环进行归并, 直到归并到某一个链表末尾, 然后接上另外一个链表的剩余数据即可思路二 : 判断两个链表的第一原创 2016-01-08 19:47:26 · 754 阅读 · 0 评论 -
11 是否存在子树 & 二叉树镜像
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述 & 思路对于第一个问题, 判断给定的树[subRoot]是否是给定的树的子树[root] 思路一 : 基于递归, 首先判断给定的两个结点是否为null 如果两个结点都不为空 首先判断两个结点的数据是否一致, 如果是 则判断两个子树是否相同, 如果相同 返回true 否则 递原创 2016-01-08 20:33:50 · 505 阅读 · 0 评论 -
12 蛇形打印矩阵中的数据
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述示例 思路对于这个问题, 书上给出的解法是给定一个索引表示当前打印的第几圈, 然后一圈一圈的打印 书中的思路 我会在下面贴出来而下面的参考代码是我的思路, 这道题似乎 我在两年前就见过了吧, 而解答的思路就是那个时候的思路 代码中还有一个方法是生成蛇形矩阵, 思路和上面蛇形打印矩阵的思路一致思路如下 : 书中的思路原创 2016-01-09 21:01:57 · 511 阅读 · 0 评论 -
13 给定的出栈序列是否满足入栈序列
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了一种解法思路 : 依照给定的序列模拟进行压栈, 出栈操作, 判断是否能够形成给定的出栈序列, 详细思路请见 “剑指offer”, 或者下面的代码的注释参考代码/** * file name : Test06StackPushPopOrder.java * created at : 2:15:32 P原创 2016-01-09 21:19:29 · 478 阅读 · 0 评论 -
14 判断给定的二叉排序树后序遍历序列是否合法
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了一种解法思路 : 输入为一个后序遍历的序列, 从这里 我们可以得到序列中最后一个元素为根节点, 又因为该树是二叉排序树, 则表明序列中左子树的每一个结点的key小于等于根节点的key, 右子树的部分每一个结点的key大于等于根节点的key, so 我们是可以根据后序遍历序列大致区分出整棵树的左子树部分,原创 2016-01-11 20:45:36 · 1222 阅读 · 0 评论 -
15 打印给定的二叉树中和为给定的值的路径
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了一种解法令所求的和为sum 思路 : 使用一个stack来维护可能的路径, 令now为当前路径的所有数据和, 从root结点开始递归遍历, 如果now为sum, 打印出当前路径, 剪枝条件为now大于sum, 否则 递归左右子树参考代码/** * file name : Test08SumAsPat原创 2016-01-11 21:06:23 · 486 阅读 · 0 评论 -
16 复杂链表的复制
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了两种解法, 难点在于对于sibling引用的复制 对于 这两种思路, 我本来是想画图的, 但是 感觉绘制起来挺有难度的, so 文字描述吧, “剑指offer” p148 有详细的解释思路一 : 然后根据原链表的数据创建一个新的链表, 确保该链表中除了next, sibling引用之外的其他卫星数据和原创 2016-01-12 20:55:16 · 445 阅读 · 0 评论 -
17 将二叉排序树转换为有序双链表
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路思路 : 因为要将二叉排序树更新各个结点的引用更新为一个有序双链表, 所以必然需要将左子树的最大结点 和根节点和 右子树的最小结点连在一起, 这样的话将左右子树看成一个整体, 整个链表就变成了”左子树 - 根节点 - 右子树”, 有序, 然后对于左右子树递归处理参考代码/** * file name : Test10Binar原创 2016-01-12 21:11:38 · 852 阅读 · 0 评论 -
18 获取给定的序列的所有排列, 组合
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路这里有两个问题, 一个是求所有的字符的全排列, 一个是求所有字符的组合 对于问题一, 书上给了一种解法 思路 : 对于一个原始序列, 第一次交换第一个字符 和第一个字符以及后面的字符, 然后递归进入交换第二个字符阶段[同样是交换第二个字符 以及之后的字符], 这样直到交换完所有的字符之后, 打印出序列, 接着返回上一层递归,原创 2016-01-15 10:00:23 · 1182 阅读 · 0 评论 -
19 获取给定的数组能够组成的最小的数字
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 两种思路思路一 : 万事不能离的穷举算法, 全排列所给的数字, 然后选出最小的数据思路二 : 首先获取数组中最大的数字, 获取其长度lenMax, 然后将其他的不足lenMax的数字补全到lenMax[newData, 维护一个newData到原数据的索引的映射], 然后对所有的字符串进行排序, 然后依次从大到小原创 2016-01-15 10:47:12 · 654 阅读 · 0 评论 -
27 电话号码排序
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑这部分来自于编程珠玑, “编程珠玑”就是从这个例子开始的, 我看了过后, 感觉非常有意思啊, 觉得能够冲这本书中学到很多东西 不过 后来看完之后, 又过了几个月, 便基本上快要忘光了… 可能是对于 这本书敲的代码不多吧, 很多问题在前面的几本书中出现过 这本书敲的代码 似乎仅仅4, 5个 而且 部分章节十分注理论的描述, so 忘原创 2016-01-20 21:22:18 · 669 阅读 · 0 评论 -
26 parseInt
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 看着虽然简单, 但是 这个问题的背后是考面试者的思维是否仔细, 所以 难点主要在于代码的鲁棒性, 要能够应付可能输入的任意输入需要检查的几个点, 判断输入是否为空, 判断第一位是否是符号, 判断符号之后是否为空 检查每一个字符的区间是否在正常范围内, 进行计算结果, 判断 是否溢出 等等更优秀的代码, 可以看一原创 2016-01-20 20:24:43 · 409 阅读 · 0 评论 -
02 替换' '为"%32"
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路书中给出的思路有两种, 但是 第一种似乎是”太累赘”了吧, 这里就不说了 思路 : 首先遍历一次字符串, 获取所有’old字符’的个数, 然后根据’old字符’的个数, 和’new字符串’和’old字符串’的长度差计算出替换后的字符串需要的长度, 分配空间 然后再遍历一次字符串 “将’old字符’替换为’new字符串’ ”原创 2015-12-28 22:46:23 · 331 阅读 · 0 评论 -
20 找出第1500个丑数
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 两种思路思路一 : 万事不能离的穷举算法, 从1开始穷举, ….是狠思路二 : 丑数不是只由2,3,5构成的嘛,而且我们拿到的数也是由2,3,5构成的,而且是最小的10个,那么第11个一定就比前十个数中的某一个多一个因子2,或者因子3,或者因子5……也就是说,第11个丑数一定是前十个丑数中某一个丑数的2倍,或者3原创 2016-01-15 21:09:45 · 629 阅读 · 0 评论 -
03 给定链表头结点, 依次输出从尾节点到头结点的数据
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路书中给出的思路有两种 思路一 : 利用额外的一个栈维护链表中的数据, 然后在逐个出栈即可思路二 : 递归的思路, 如果下一个结点不为空, 先递归下一个结点[递归递归], 然后在打印当前结点的数据, 因为非尾递归, 所以需要保存当前方法的栈帧, 造成栈帧资源的开销参考代码/** * file name : Test24Link原创 2015-12-29 20:42:57 · 791 阅读 · 0 评论 -
04 两个栈构造队列 & 两个队列构造栈
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述利用两个栈构造一个队列, 使用两个队列构造一个栈思路两个栈构造队列 : 一个栈作为存储数据的栈, 另一个栈作为业务栈, 入队 : 直接向存储栈添加数据, 出队 : 如果业务栈为空 则将存储栈中的数据倒入业务栈, 如果此时业务占仍然为空 返回null两个队列构造栈 : 思路一 : 一个队列作为业务队列, 一个队列作为原创 2015-12-29 21:26:36 · 618 阅读 · 0 评论 -
21 反转句子顺序
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了一种思路, 我思考了一种思路思路一 : 首先将整个句子反转一下, 然后在将句子中的每个词翻转一下 比如 句子为 “Hello World” -> 步骤一 -> “dlroW olleH” -> 步骤二 -> “World Hello”我的思路就比较简单啦 : 首先将句子按照空格分隔开, 然后在倒序收集原创 2016-01-16 20:32:09 · 397 阅读 · 0 评论 -
22 k个骰子掷出n的概率
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了两种思路 这里 我代码中求解的是给定k表示k个骰子, n表示各个向上的点子和为n, 求解k个骰子投掷出n的概率思路一 : 穷举..思路二 : 首先我们已知的条件为1个骰子掷出1, 2, 3, 4, 5, 6的可能性为1种, 然后我们递推 其余k个骰子掷出的2, 3, 4, …的和为(i, i*6)的可原创 2016-01-16 21:03:22 · 614 阅读 · 0 评论 -
05 旋转数组中的最小数字
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路书中给出了两种思路 思路一 : 遍历一次列表找出最小的元素思路二 : 如果 head < tail 则说明arr本身就是一个有序的数列 否则如果 head==tail==(head+tail/2) 这个是不能用下面的方式判定, 所以采用顺序比较, 否则 计算head, tail的中间索引原创 2015-12-30 20:20:40 · 324 阅读 · 0 评论 -
24 约瑟夫环
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了两种思路思路一 : 使用一个链表保存各个数据, 然后每次移动k位, 删除一个元素, 不断迭代下去, 直到链表中只剩下了一个元素, 即为所求思路二 : 使用数学推导得出的结论, 进行直接迭代计算参考代码/** * file name : Test20JosephRing.java * created原创 2016-01-17 20:51:44 · 497 阅读 · 0 评论 -
06 实现数值的整数次方
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路书中给出了两种思路 设定输入的基数为base, 幂数为exp 思路一 : 构造一个循环, exp次相乘得到结果思路二 : 在第一种思路的前提下面, 对于输入进行检查, 增加处理负数的情况 [鲁棒性]思路三 : 在第二种思路的基础上面, 优化求幂的过程, 将pow(3, 7) –decompose–> pow(3, 4) *原创 2015-12-30 21:21:42 · 435 阅读 · 0 评论 -
25 不使用加减乘除做加法
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路这里有两个问题, 一个是不准使用操作符, 来实现加减乘除, 另外一个问题是不不准使用临时空间交换两个元素首先说一说第二个问题吧, 比较简单思路一 : 使用加法 或者减法, 首先使用一个数字[tmp01]来表示两个数字的和 / 差, 然后在将另外一个数字[tmp02]赋值为, tmp01 减去/ 加上tmp02, 得到的就是之前的原创 2016-01-18 21:08:54 · 417 阅读 · 0 评论 -
07 打印1到最大的n位数
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路书中给出了三种思路 思路一 : 获取n位数能够表示的最大的数字, 然后构造一个循环, 打出来, 不过这个受到了变量能够表示的最大的数字的限制思路二 : 使用n个char的字符数组, 然后将最大的位置的字符是否到达“‘9’+1”, 作为循环的结束条件, 每一个循环, 增加最低位置的字符[如果存在进位, 级联增加]思路三 :原创 2015-12-31 20:59:51 · 745 阅读 · 0 评论 -
08 将奇数排在偶数之前
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路书中给出了两种思路 思路一 : 前后两个索引, 将前面的指针初始化为第一个偶数的位置, 将第二个指针初始化为从后向前数的第一个奇数的位置, 然后 只要前面的索引小于后面的索引, 则交换两个索引对应的数据, 更新两个索引的位置 [更新为下一个奇数/ 偶数的位置]思路二 : 更加扩展的一种方式, 将判断奇偶的函数作为参数传入, 这原创 2015-12-31 21:18:06 · 590 阅读 · 0 评论 -
09 链表中找出倒数第k个数 & 找出链表正中间的数据
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于找到倒数的第k个数 : 两个指针, 先让第一个指针先走k步, 然后两个指针一起移动, 直到第一个指针为null, 第二个指针指向的数据即为所求对于找到中间数 : 同样两个指针, 一个指针每次移动两步, 另外一个指针每次移动一步, 到第一个指针为null的时候, 第二个指针即为所求参考代码/** * file name :原创 2016-01-01 21:05:46 · 398 阅读 · 0 评论 -
23 判断扑克牌的顺子
前言本博文部分图片, 思路来自于剑指offer 或者编程珠玑问题描述思路对于这个问题, 书中给出了一种思路思路一 : 先将数组进行排序, 然后获取到第一个非0元素的位置, 然后获取之后的元素的每两个相邻元素之间的差值[“空白元素部分”], 相邻两个元素相同为剪枝条件[根据题目的需求], 可以直接返回false, 统计所有的”空白元素”的个数, 最后比较总的”空白元素”的个数 和数组前面”0的个数”,原创 2016-01-17 20:42:29 · 909 阅读 · 0 评论