剑指offer
文章平均质量分 58
pcwl1206
这个作者很懒,什么都没留下…
展开
-
【剑指offer】面试题43:1 ~ n 整数中 1 出现的次数
题目:输入一个非负整数n,求从1到n个整数的十进制表示中1出现的次数。例如:输入12,从1到12这些整数中包含1的数字有1,10,11,和12,1一共出现了5次。 牛客网链接:https://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6方法一:不考虑时间效率的解法,靠它拿 Offer 有点难...原创 2019-01-14 15:28:56 · 323 阅读 · 0 评论 -
【剑指offer】面试题11:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为 {1, 2, 3, 4, 5} 的一个旋转,该数组的最小值为1。 这道题最直观的解法并不难,从头到尾遍历一次,我们就能找到最小的元素。这种思路的时间复杂度为O(n)。但是这个思路没有利用输入的旋转数组的特性,肯定达不到...原创 2019-01-03 11:22:01 · 569 阅读 · 0 评论 -
【剑指offer】面试题29:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。牛客网链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a 下面先通过一个案例讲解下什么是从外向里以顺时针的顺序依次打印出每一个数字。当遇到一个复杂的问题的时候,我们可以用图形来帮助我们来思考。由于是从外圈到内...原创 2019-01-07 18:43:50 · 295 阅读 · 0 评论 -
【剑指offer】面试题28:对称的二叉树
题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。牛客网链接:https://www.nowcoder.com/questionTerminal/ff05d44dfdb04e1d83bdbdab320efbcb 如上图所示:第一棵二叉树是对称的,剩下两棵都不是对称的。通常我们有三种不同的二叉树遍历方法:前序遍历、中序遍历以及后续...原创 2019-01-07 16:14:12 · 354 阅读 · 0 评论 -
【剑指offer】面试题38:字符串的排列
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。牛客网链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7例...原创 2019-01-12 16:52:43 · 921 阅读 · 1 评论 -
【剑指offer】面试题27:二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。牛客网题目链接:https://www.nowcoder.com/questionTerminal/564f4c26aa584921bc75623e48ca3011 如下图所示:两棵互为镜像的二叉树:仔细分析这两棵树的特点,看看能不能总结出求镜像的步骤。这两棵树的根节点相同,但它们的左右两个子节点交换了位置。因此我们不妨...原创 2019-01-07 15:18:42 · 346 阅读 · 0 评论 -
【剑指offer】面试题10:斐波那契数列
题目1:求斐波那契数列的第n项。 写一个函数,输入n,求斐波那契数列(Fibonacci)数列的第 n 项。斐波那契数列的定义如下: 方法1:效率很低效的解法,挑剔的面试官不会喜欢 很多C语言的教科书在讲述递归函数的时候,都会拿 Fibonacci 作为例子,因此很多的应聘者对这道题的递归解法都很熟悉。下面是实现代码:我们教科书上反复用这个问题来讲解递归的函数,...原创 2019-01-02 22:25:43 · 268 阅读 · 0 评论 -
【剑指offer】面试题37:序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树。 如果二叉树的序列化是从根节点开始的,那么相应的反序列化在根节点的数值读出来的时候就可以开始了。因此,我们根据前序遍历的顺序来序列化二叉树,因为前序遍历是从根节点开始的。在遍历二叉树碰到 null 指针时,这些 null 指针序列化成为一个特殊的字符(如“#”)。序列化和反序列化的过程都是将二叉树分解为 3 部分:根节点、左子树和右...原创 2019-01-12 11:30:03 · 169 阅读 · 0 评论 -
【剑指offer】面试题26:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。 例如:下图中所示的两棵二叉树,由于A中有一部分子树的结构和B 是一样的,因此B是A的子结构。 要查找树A中是否存在和树B结构一样的子树,我们可以分两步:第一步:在树A中找到和B的根节点的值一样的结点R;第二步:再判断树A中以R为根结点的子树是不是包含和树B一样的结构。以上面的两棵树为例来详细分析这个过程。首先我们试着...原创 2019-01-07 12:16:04 · 297 阅读 · 0 评论 -
【剑指offer】面试题12:矩阵中的路径
【题目描述】请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如下面所示的矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径...原创 2019-01-03 15:11:02 · 207 阅读 · 0 评论 -
【剑指offer】面试题30:包含 min 函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素 min 函数。在栈中,调用 min、push、及 pop 的时间复杂度都是O(1)。 我们可以使用两个栈,一个数据栈,另一个为辅助栈。辅助栈用于存放最小元素和每次压栈时的次小元素(之前的最小元素和新压入栈的元素两者之间的最小值或相等)。如果每次都把最小元素压入辅助栈,那么就能保证辅助栈顶一直都是最小元素。当最小元素从数据...原创 2019-01-07 21:49:58 · 269 阅读 · 0 评论 -
【剑指offer】面试题31:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)牛客网链接:https://www.nowcoder.com/questionTer...原创 2019-01-07 22:41:06 · 391 阅读 · 0 评论 -
【剑指offer】面试题42:连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。牛客网链接:https://www.nowcoder.com/questionTerminal/459bd355da1549fa8a49e350bf3df484 例如输入的数组为{1,-2,3,10,-4,7,2,-5 },和最大的子数组为{3,1...原创 2019-01-14 11:47:52 · 981 阅读 · 0 评论 -
【剑指offer】面试题34:二叉树中和为某一值的路径
题目:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前) 链接:https://www.nowcoder.com/questionTerminal/b736e784e3e34731af99065031301bca由于 TreeNode ...原创 2019-01-08 18:51:25 · 362 阅读 · 0 评论 -
【剑指offer】面试题33:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。牛客网链接: https://blog.csdn.net/jsqfengbao/article/details/47281789下面先看个案例了解下这个题目的意思。如上图的二叉搜素树所示,如果输入的数组为{5,7,6,9,1...原创 2019-01-08 16:49:41 · 370 阅读 · 0 评论 -
【剑指offer】面试题41:数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。由于数据是从一个数据流中读出来的,因而数据的数目随着时间的变化而增加的。如果用一个数据容器来保存从流中读出来的数据,则当有新的数据从流中读出来时,这些数据就插入数据容器。这个数据容器可以用很多的数据...原创 2019-01-14 10:39:54 · 444 阅读 · 0 评论 -
【剑指offer】面试题40:最小的 k 个数
题目:输入n个整数,找出其中最小的 k 个数。例如输入 4, 5, 1, 6, 2, 7, 3, 8 这 8 个数字,则最小的 4 个数字是1, 2, 3, 4。牛客网链接:https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf这道题最简单的思路莫过于把输入的 n 个整数排序,排序之后位于最前...原创 2019-01-13 18:56:37 · 487 阅读 · 1 评论 -
【剑指offer】面试题32:从上到下打印二叉树
题目1:不分行从上到下打印二叉树。从上往下打印出二叉树的每个节点,同一层的节点从左到右的顺序打印。牛客网链接:https://www.nowcoder.com/questionTerminal/7fe2212963db4790b57431d9ed259701 例如输入下图的二叉树,则依次打印出:8,6,10,5,7,9,11。这道题实质上考察的就是树的遍历算法,只是这种遍历不是...原创 2019-01-08 10:53:02 · 294 阅读 · 0 评论 -
【剑指offer】面试题39:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。牛客网链接:https://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a921...原创 2019-01-13 16:16:09 · 384 阅读 · 0 评论 -
【剑指offer】面试题25:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。 例如输入图中的链表1和链表2,则合并之后的升序链表3所示。这是一个经常被各公司采用的面试题。在面试过程中,我们发现应聘者最容易犯两个错误:一是在写代码之前没有对合并的过程想清楚,最终合并出来的链表要么中间断开要么并没有递增排序;二是代码的鲁棒性方面存在问题,程序一旦有特殊的输入(如空链表)就会崩溃...原创 2019-01-07 10:32:36 · 545 阅读 · 1 评论 -
【剑指offer】面试题24:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。牛客网连接: https://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca 解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多的面试官喜欢出链表相关的问题,就是想通过指针操作来考察应聘者的编码功...原创 2019-01-06 18:06:03 · 308 阅读 · 0 评论 -
【剑指offer】面试题36:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 比如如下图中的二叉搜索树,则输出转换之后的排序双向链表为: 在二叉树中,每个结点都有两个指向子节点的指针。在双向链表中,每个结点也有两个指针,他们分别指向前一个结点和后一个结点。由于这两种结点的结构相似,同时二叉搜索树也是一种排序的数据结构,因此在理论上有可能实...原创 2019-01-11 16:10:49 · 368 阅读 · 0 评论 -
【剑指offer】面试题7:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4, 7, 2, 1, 5, 3, 6, 8},则重建出二叉树并输出它的头结点。 在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。但在中序遍历中,根节点的值在序列的中间,左子树...原创 2018-12-31 12:03:02 · 282 阅读 · 0 评论 -
【剑指offer】面试题6:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。看到这道题,很多人的第一反应是从头到尾输出将会比较简单,于是我们很自然的想到把链表中的节点的指针反转过来,改变链表的方向,然后就可以从头到尾输出了。但该方法将会改变原来链表的结构。是否允许在打印链表的时候修改链表的结构?这个取决于面试官的要求,因此在面试的时候我们要询问清楚面试官的要求。通常打印是一个只读操作,我们不希望打印...原创 2018-12-31 10:35:23 · 297 阅读 · 0 评论 -
【剑指offer】面试题5:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成 “%20”。 例如输入 “We are happy.”,则输出”We%20are%20happy.”。 时间复杂度为O()的解法 最直观的做法就是从头到尾扫描字符串,每次碰到空格字符的时候就进行替换。由于是把1个字符替换成3个字符,因此必须把空格后面的所有字符都要后移2个字节,否则就会有两个字符被覆盖了。假设字符串的长度是n,对...原创 2018-12-30 22:01:05 · 673 阅读 · 0 评论 -
【剑指offer】面试题4:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。规律:首先选取数组中右上角的数字。 如果该数字等于要查找的数字,查找过程结束。 如果该数字大于要查找的数字,剔除这个数字所在的列; 如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字...原创 2018-12-30 19:42:08 · 557 阅读 · 0 评论 -
【剑指offer】面试题3:数组中的重复数字
题目1:找出数组中重复的数字在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。解题思路:从哈希表的思路拓展,重排数组:从头到尾依次扫描这个数组中的每个数字...原创 2018-12-30 19:01:41 · 711 阅读 · 0 评论 -
【剑指offer】面试题2:实现 Singleton 模式
本文目录:懒汉式和饿汉式解法1:只适用于单线程环境 (不好)解法2:虽然在多线程环境中能工作,但是效率不高 (不好)解法3:加同步锁前后两次判断实例是否存在 (可行)解法4:利用类静态变量初始化一个实例 (推荐使用)解法5:静态内部类实现按需创建实例 (推荐使用)总结题目:设计一个类,我们只能生成该类的一个实例。考点:对单例模式(Singleton)模型的...原创 2018-12-30 12:19:05 · 304 阅读 · 0 评论 -
【剑指offer】面试题15:二进制中 1 的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2。 1、可能引起死循环的解法 这是一道很基本的考察二进制和位运算的面试题。题目不是很难,面试官提出问题之后,我们很快形成一个基本的思路:先判断整数二进制表示中最右边一位是不是1;接着把输入的整数右移一位,此时原来处于从右边数起的第二位被移到最...原创 2019-01-04 11:17:48 · 464 阅读 · 1 评论 -
【剑指offer】面试题14:剪绳子
题目:给你一根长度为 n 绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。每段的绳子的长度记为k[0]、k[1]、…… 、k[m]。请问 k[0] * k[1] * … * k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。 思路 本题采用动态规划或者贪婪算法可以实现。一开始没有思路时,可以从简单的...原创 2019-01-04 10:29:40 · 409 阅读 · 0 评论 -
【剑指offer】面试题8:二叉树的下一个节点
题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。我们来分析下,求给定节点的下一个节点的的几种情况:1、若二叉树为空,则返回空;2、给定节点的右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子节点的指针找到的叶子节点即为下一个节点(即给定节点的右子树中的最左子节点);3...原创 2018-12-31 16:04:37 · 167 阅读 · 0 评论 -
【剑指offer】面试题16:数值的整数次方
题目:实现函数 double Power(double base, int exponent),求 base 的 exponent 次方。不得使用库函数,同时不需要考虑大数问题。 1、自以为很简单的解法 由于不需要考虑大数问题,这道题看起来很简单,可能不少应聘者在看到题目30秒后就能写出如下的代码:public double powerWithExponent(double...原创 2019-01-04 22:37:42 · 357 阅读 · 0 评论 -
【剑指offer】面试题17:打印从 1 到最大的 n 位数
题目:输入数字n,按顺序打印出从1最大的的n位数十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999。 1、跳进面试官的陷进 这个题目看起来很简单。我们看到这个问题后,最容易想到的办法是求出最大的n位数,然后用一个循环从1开始逐个打印。于是我们很容易写出下面的代码:public class Print1ToMaxOfNDigits { // 方法一:没有考虑...原创 2019-01-05 11:19:26 · 1596 阅读 · 0 评论 -
【剑指offer】面试题23:链表中环的入口节点
题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 解决这个问题的第一步是:如何确定一个链表中包含环。可以受前面22题的启发,我们可以用两个指针来解决这个问题。和前面的问题一样,定义两个指针,同时从链表的头节点出发,第一个指针一次走一步,第二个指针一次走两步。如果走得快得指针追上了走得慢的指针,那么链表就包含环;如果走得快得指针走到了链表得末尾都没有追上第一个...原创 2019-01-06 16:53:09 · 473 阅读 · 1 评论 -
【剑指offer】面试题22:链表中倒数第 K 个节点
题目: 输入一个链表,输出该链表中倒数第k哥结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6。这个链表的倒数第3个结点是值为4的结点。 为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步。可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从前往...原创 2019-01-06 15:02:37 · 1903 阅读 · 3 评论 -
【剑指offer】面试题21:调整数组顺序使奇数位于偶数前面
题目1:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有的数字往前面挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于每碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O()。...原创 2019-01-06 13:29:52 · 5856 阅读 · 5 评论 -
【剑指offer】面试题20:表示数值的字符串
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串 ”+100”、”5e2”、”-123”、”3.1416”和”-1E-16”都表示数值。 但是”12e”、”1a3.14”、”1.2.3”、”+-5”和”12e+4.3”都不是。 合法的数值可以表示为A[.[B]][e|EC]或者.B[e|EC]。其中A为整数部分,B为小数部分,C为e|E的指数部分...原创 2019-01-06 10:40:30 · 486 阅读 · 2 评论 -
【剑指offer】面试题35:复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)牛客网链接:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 本题目...原创 2019-01-11 10:28:56 · 298 阅读 · 0 评论 -
【剑指offer】面试题19:正则表达式匹配
题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配 链接:https://www.nowcoder.com/questionTermin...原创 2019-01-05 21:02:55 · 529 阅读 · 0 评论 -
【剑指offer】面试题9:用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。 我们通过一个具体的例子来分析该队列插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空。再压入两个元素b和c,还是插入到stack1中,此时stack1中的...原创 2018-12-31 17:56:09 · 230 阅读 · 0 评论