![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
fly103226
这个作者很懒,什么都没留下…
展开
-
面试题28:翻转字符串
一、题目 题目描述:单词翻转:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,输入“I am a student.”,则输出“student. a am I”二、解法 思路:第一步翻转句子中所有的字符串,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。第二步再翻转每个单词中字符的顺序。/...原创 2018-07-15 13:02:44 · 174 阅读 · 0 评论 -
面试题39:数组中出现次数超过一半的数字
一、题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。二、解法2.1 方法一:基于Partition函数的时间复杂度为O(n)的算法class Solution {public: int Partition(vecto...原创 2018-07-02 19:11:13 · 119 阅读 · 0 评论 -
面试题31:栈的压入、弹出序列
一、题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)二、解法 思路:总结入栈、出栈的过程,我们可以找到判断一个序列是不是栈的弹出序...原创 2018-06-27 14:43:54 · 101 阅读 · 0 评论 -
面试题30:包含min函数的栈
一、题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。二、解法思路:利用一个辅助栈来存放最小值 栈 3,4,2,1 辅助栈 3,3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就入栈当前的辅助栈顶;当出栈时,辅助栈也要出栈 这种做法...原创 2018-06-27 10:55:41 · 125 阅读 · 0 评论 -
面试题29:顺时针打印矩阵
一、题目 顺时针打印矩阵:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。如下图的矩阵顺序打印的数字为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10 1 2 3 4 ...原创 2018-06-27 10:31:32 · 154 阅读 · 0 评论 -
面试题28:对称的二叉树
一、题目 对称的二叉树:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。如下图:二、解法 思路:我们可以通过比较二叉树的前序遍历序列和对称的前序遍历序列来判断二叉树是不是对称的,如果两个的序列是一样的,那么二叉树就是对称的。#include <cstdio>#include <iostream>using ...原创 2018-06-27 09:51:33 · 124 阅读 · 0 评论 -
面试题26:树的子结构
一、题目 树的子结构:输入两棵二叉树A和B,判断B是不是A的子结构。 8 8 / \ /...原创 2018-06-26 20:53:54 · 181 阅读 · 0 评论 -
面试题25:合并两个排序的链表(C++/Python)
一、题目 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链表3所示。二、解法(递归)#include <cstdio>#include <iostream>using namespace std;struct ListNode{ int m_nValu...原创 2018-06-26 15:45:25 · 227 阅读 · 0 评论 -
面试题24:反转链表
一、题目 反转链表:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。二、解法 分析: 为了正确的反转一个链表,需要调整链表中指针的方向,如下图,我们在调整i的next指针时,除了需要知道节点i本身,还需要知道i的前一个节点h,因为我们需要把i的next指向节点h,同时,我们还需要先保存i的下一个节点j,以防止链表断开,因此,相应的我们需要定义3个指针,分别指向...原创 2018-06-26 11:10:33 · 140 阅读 · 0 评论 -
面试题23:链表中环的入口节点
一、题目 一个链表中包含环,如何找出环的入口结点?例如,在图的链表中,环的入口结点是结点3。图. 节点3是链表环的入口节点二、解法 分析:解决这个问题第一步是如何确定一个链表中包含环。我们可以定义两个指针,同时从链表头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走的快的指针追上了走得慢的指针,那么链表就包含环;如果走的快的指针走到了链表的末尾都没有追上第一个指针,那么链表...原创 2018-06-26 10:18:07 · 112 阅读 · 0 评论 -
面试题40:最小的K个数
一、题目 输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8 这8个数字,则最小的4个数字是1、2、3、4。二、解法 分析:这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数,这种思路的时间按复杂度是O(nlogn).2.1 方法一:时间复杂度为O(n)的算法,只有当我们可以修改输入的数组时可用 思路:从解决面试题...原创 2018-07-02 20:00:43 · 175 阅读 · 0 评论 -
面试题32:从上到下打印二叉树
一、 题目 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。如图所示的二叉树,依次打印出8,6,10,5,7,9,11.二、解法表. 按层打印图中二叉树的过程步骤 操作队列1打印节点8节点6、节点102打印节点8节点10、节点5、节点73打印节点8节点5、节点7、节点9、节点114打印节点8节点7、节点9、节点115打印节点8节点9、节点116打印节点8节点117打印...原创 2018-06-27 15:45:50 · 130 阅读 · 0 评论 -
面试题33:二叉搜索树的后序遍历序列
一、题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。 例如:输入数组{5, 7, 6, 9, 11, 10, 8},则返回true,因为这个整数序列如图二叉搜索树的后序遍历结果。如果输入的数组是{7, 4, 6, 5},则由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返回fa...原创 2018-06-27 16:55:36 · 98 阅读 · 0 评论 -
平衡二叉树的判定
一、题目 题目描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。二、解法2.1 方法一 思路:在遍历树的每一个节点的时候,调用TreeDepth函数得到它的左右子树的深度,如果每个节点的左右子树的深度相差都不超过1,那么按照定义它就是一棵平衡二叉树。int TreeDepth(const Binary...原创 2018-07-14 20:45:39 · 1395 阅读 · 0 评论 -
面试题55:二叉树的深度
一、题目 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如下图中的二叉树的深度为4,因为它从根结点到叶结点最长的路径包含4个结点(从根结点1开始,经过结点2和结点5,最终到达叶结点7)。二、解法思路: ①如果一棵树只有一个结点,它的深度为1。 ②如果根结点只有左子树而没有右子树,那么树的深度应该是...原创 2018-07-14 20:09:59 · 202 阅读 · 0 评论 -
面试题53:在排序数组中查找数字
一、题目 统计一个数字在排序数组中出现的次数,例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.二、解法思路:既然输入的数组是排序的,那么我们自然能想到用二分查找算法,如何高效的利用二分查找,可以分别利用二分查找找到第一个k和最后一个k。class Solution {public: int GetNumberOfK(vect...原创 2018-07-14 19:44:01 · 339 阅读 · 0 评论 -
面试题52:两个链表的第一个公共节点
一、题目 输入两个链表,找出它们的第一个公共节点。二、解法 思路:假设链表1比链表2长。 则从两个链表的头结点开始遍历,前提是先让较长的链表前进(length1-length2)个节点,然后同时开始遍历,它们可以同时到达第一个公共节点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : ...原创 2018-07-14 17:06:35 · 132 阅读 · 0 评论 -
面试题51:数组中的逆序对
一、题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)(7,5)(7,4)(6,4)(5,4)二、解法 看到这道题目,第一反应是顺序扫描整个数组,没扫描到一个数字,逐个比较该数字和它后面数字的大小,如果后面的数字比它小,则这两个数字就组成...原创 2018-07-14 17:02:52 · 173 阅读 · 0 评论 -
面试题50:第一个只出现一次的字符
一、题目在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出“b”。二、解法(hashTable) 思路:为了解决这个问题,可以定义哈希表的KEY是字符,而Value是该字符出现的次数,同时我们还需要从头开始扫面字符串两次,第一次扫描字符串时,每扫描到一个字符,就在哈希表对应项中把次数加1。接下来第二次扫描时,没扫到一个字符,就能在哈希表中得到该字符出现的次数。这样,第...原创 2018-07-14 15:58:58 · 188 阅读 · 0 评论 -
面试题48:最长不含重复字符的子字符串
一、题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从'a'到'z'的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4.二、解法 思路:利用动态规划算法,首先定义函数f(i)表示以第i个字符结尾的不包含重复字符的子字符串的最长长度。如果第i个字符之前没有出现过,那么f(i) = f(...原创 2018-07-14 11:27:51 · 451 阅读 · 0 评论 -
42. 连续子数组的最大和
一、题目 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向...原创 2018-07-02 22:25:57 · 142 阅读 · 0 评论 -
面试题41:数据流中的中位数
一、题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。二、解法数据结构插入的时间复杂度得到中位数的时间按复杂度没有排序的数组O(1)O(n)排序的数组O(n)O(1)排序的链表O(n)O(1)二叉搜索树平均O(logn),最差O(n)平均O(l...原创 2018-07-02 21:08:02 · 231 阅读 · 0 评论 -
面试题22:链表中倒数第k个节点
一、题目 链表中倒数第k个节点: 输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。二、解法 思路:定义两个指针,第一个指针从连标点的头指针开始遍历,向前走k-1步,第二个指针保持不动;从第k步开始,第二...原创 2018-06-26 08:29:28 · 251 阅读 · 0 评论 -
面试题38:字符串的排列
一、题目 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。二、解法class Solution {public: vector<string> Permutation(string str) { vector<string...原创 2018-06-29 21:31:00 · 237 阅读 · 0 评论 -
面试题35:复杂链表的复制
一、题目 复杂链表的复制:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。struct ComplexListNode{ int m_n...原创 2018-06-29 19:32:50 · 124 阅读 · 0 评论 -
面试题7:重建二叉树
一、题目 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出如所示的二叉树并输出它的头结点。 1 ...原创 2018-06-17 16:19:18 · 113 阅读 · 0 评论 -
面试题8:二叉树的下一个节点
一、题目 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。 二、解法 图中的二叉树中序遍历序列为{d, b, h, e, i, a, f, c, g}。分析 如果一个节点有右子树。那么它的下一个节点就是它的右子树中的最左子节点,也就是说,从右子节点出发一直沿着指向左子节点的指针...原创 2018-06-17 19:56:24 · 139 阅读 · 0 评论 -
面试题9:用两个栈实现队列
一、题目 用两个栈实现一个队列。分别完成在队列尾部插入节点和在队列头部删除节点的功能。二、解法 分析:一个队列包含两个栈stack1和stack2,首先插入一个元素a,不妨先把它插入stack1,此时stack1中的元素{a},stack2为空,在压入两个元素b和c, 还是插入stack1,此时stack1中的元素有{a, b, c}。其中c位于栈顶,而stack2仍然是空的。...原创 2018-06-19 17:02:40 · 163 阅读 · 0 评论 -
面试题10:斐波那契数列
一、题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。其中通项公式如下:{\displaystyle F_{1}=1}{\displaystyle F_{n}=F_{n-1}+F_{n-2}}(n≧2) 二、解法2.1 方法一:递归 分析:很多教科书在讲述递归函数的时候,都会用斐波那契数列作为例子,并不意味着递归解法最适合这道题目,递归解法会有很严重的效率问题...原创 2018-06-19 19:24:23 · 1327 阅读 · 1 评论 -
斐波那契数列应用──青蛙跳台阶问题
一、题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶总共有多少种跳法二、解法 分析:首先考虑最简单的情况,如果只有1级台阶,那么显然只有一种跳法;如果有2级台阶,那就有两种跳法:一种是分两次跳,每次跳一级,另一种是一次跳2级。接着我们讨论一般的情况,我们把n级台阶的跳法看成n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一...原创 2018-06-19 21:45:49 · 554 阅读 · 0 评论 -
面试题11:旋转数组的最小数字
一、题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。二、解法分析:这道题最直观的解法很简单那,从头到尾遍历数组一次,就得到了最小的元素,这种思路的时间复杂度显然是O(n),但这种思路没有利用输入的旋转数组的特...原创 2018-06-21 10:54:36 · 125 阅读 · 0 评论 -
面试题12: 矩阵中的路径 (回溯法)
一、题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一...原创 2018-06-23 16:26:34 · 957 阅读 · 0 评论 -
面试题13:机器人的运动范围
一、题目 地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。 但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?二、解法 分析:和上一个博客面试题12:...原创 2018-06-23 17:07:11 · 223 阅读 · 0 评论 -
面试题:剪绳子──动态规划 or 贪心算法
一、题目 剪绳子:给你一根长度为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。二、解法 我们有两种不同的方法解决这个问题,先用常规的需要O(n²)时间和O(n)空间的...原创 2018-06-23 17:32:16 · 1391 阅读 · 0 评论 -
面试题6:从尾到头打印链表
一、题目 输入一个链表的头结点,从尾到头反过来打印每个节点的值,链表定义如下:struct ListNode(){ int value; ListNode* next}二、解法 分析:看到该题第一反应是从头到尾输出将会比较简单,于是自然的想到把链表中的链接节点的指针翻转过来,改变链表的方向,然后就可以从头到尾的输出了,但是该方法会改变原链表的结构。2.1 方法一(...原创 2018-06-17 10:57:39 · 151 阅读 · 0 评论 -
面试题5:替换空格
一、题目 请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。二、解法思路:如果在原来的字符串上进行替换,就有可能覆盖修改该字符串后面的内存。如果创建新的字符串并在新的字符串上进行替换,那么可以自己分配足够多的内存。因此有两种解决方案,一种是在原字符串上进行替换,并且保证输入的字符串后面有足够多的空余内存...原创 2018-06-16 11:55:33 · 155 阅读 · 0 评论 -
面试题4:二维数组中的查找
一、题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个 整数,判断数组中是否含有该整数。$$ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix} \tag{1}$...原创 2018-06-16 10:29:30 · 103 阅读 · 0 评论 -
面试题34:二叉树中和为某一值的路径
一、题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二、解法...原创 2018-06-29 16:20:35 · 202 阅读 · 0 评论 -
面试题21:调整数组顺序使奇数位于偶数前面
一、题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。二、解法2.1 方法一:最简单思路 分析:如果不考虑时间复杂度和空间复杂度,最简单的思路就是从头扫描这个数组,将奇数放到一个新的数组中,将偶数放在另一个数组中。最后把两个数组拼接到一起。以下用Python实现:class Solution: def ...原创 2018-06-25 10:48:03 · 187 阅读 · 0 评论 -
面试题20:表示数值的字符串
一、题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。二、解法#include <cstdio>#include <iostream>using namesp...原创 2018-06-25 10:18:24 · 187 阅读 · 0 评论