
剑指offer
fly103226
这个作者很懒,什么都没留下…
展开
-
面试题28:翻转字符串
一、题目 题目描述:单词翻转:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,输入“I am a student.”,则输出“student. a am I”二、解法 思路:第一步翻转句子中所有的字符串,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。第二步再翻转每个单词中字符的顺序。/...原创 2018-07-15 13:02:44 · 240 阅读 · 0 评论 -
平衡二叉树的判定
一、题目 题目描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。二、解法2.1 方法一 思路:在遍历树的每一个节点的时候,调用TreeDepth函数得到它的左右子树的深度,如果每个节点的左右子树的深度相差都不超过1,那么按照定义它就是一棵平衡二叉树。int TreeDepth(const Binary...原创 2018-07-14 20:45:39 · 1473 阅读 · 0 评论 -
面试题55:二叉树的深度
一、题目 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如下图中的二叉树的深度为4,因为它从根结点到叶结点最长的路径包含4个结点(从根结点1开始,经过结点2和结点5,最终到达叶结点7)。二、解法思路: ①如果一棵树只有一个结点,它的深度为1。 ②如果根结点只有左子树而没有右子树,那么树的深度应该是...原创 2018-07-14 20:09:59 · 243 阅读 · 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 · 399 阅读 · 0 评论 -
面试题52:两个链表的第一个公共节点
一、题目 输入两个链表,找出它们的第一个公共节点。二、解法 思路:假设链表1比链表2长。 则从两个链表的头结点开始遍历,前提是先让较长的链表前进(length1-length2)个节点,然后同时开始遍历,它们可以同时到达第一个公共节点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : ...原创 2018-07-14 17:06:35 · 191 阅读 · 0 评论 -
面试题51:数组中的逆序对
一、题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)(7,5)(7,4)(6,4)(5,4)二、解法 看到这道题目,第一反应是顺序扫描整个数组,没扫描到一个数字,逐个比较该数字和它后面数字的大小,如果后面的数字比它小,则这两个数字就组成...原创 2018-07-14 17:02:52 · 232 阅读 · 0 评论 -
面试题50:第一个只出现一次的字符
一、题目在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出“b”。二、解法(hashTable) 思路:为了解决这个问题,可以定义哈希表的KEY是字符,而Value是该字符出现的次数,同时我们还需要从头开始扫面字符串两次,第一次扫描字符串时,每扫描到一个字符,就在哈希表对应项中把次数加1。接下来第二次扫描时,没扫到一个字符,就能在哈希表中得到该字符出现的次数。这样,第...原创 2018-07-14 15:58:58 · 230 阅读 · 0 评论 -
面试题48:最长不含重复字符的子字符串
一、题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从'a'到'z'的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4.二、解法 思路:利用动态规划算法,首先定义函数f(i)表示以第i个字符结尾的不包含重复字符的子字符串的最长长度。如果第i个字符之前没有出现过,那么f(i) = f(...原创 2018-07-14 11:27:51 · 500 阅读 · 0 评论 -
42. 连续子数组的最大和
一、题目 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向...原创 2018-07-02 22:25:57 · 187 阅读 · 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 · 270 阅读 · 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 · 234 阅读 · 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 · 159 阅读 · 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 · 271 阅读 · 0 评论 -
面试题35:复杂链表的复制
一、题目 复杂链表的复制:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。struct ComplexListNode{ int m_n...原创 2018-06-29 19:32:50 · 159 阅读 · 0 评论 -
面试题34:二叉树中和为某一值的路径
一、题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二、解法...原创 2018-06-29 16:20:35 · 247 阅读 · 0 评论 -
面试题33:二叉搜索树的后序遍历序列
一、题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。 例如:输入数组{5, 7, 6, 9, 11, 10, 8},则返回true,因为这个整数序列如图二叉搜索树的后序遍历结果。如果输入的数组是{7, 4, 6, 5},则由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返回fa...原创 2018-06-27 16:55:36 · 138 阅读 · 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 · 177 阅读 · 0 评论 -
面试题31:栈的压入、弹出序列
一、题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)二、解法 思路:总结入栈、出栈的过程,我们可以找到判断一个序列是不是栈的弹出序...原创 2018-06-27 14:43:54 · 136 阅读 · 0 评论 -
面试题30:包含min函数的栈
一、题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。二、解法思路:利用一个辅助栈来存放最小值 栈 3,4,2,1 辅助栈 3,3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就入栈当前的辅助栈顶;当出栈时,辅助栈也要出栈 这种做法...原创 2018-06-27 10:55:41 · 159 阅读 · 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 · 199 阅读 · 0 评论 -
面试题28:对称的二叉树
一、题目 对称的二叉树:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。如下图:二、解法 思路:我们可以通过比较二叉树的前序遍历序列和对称的前序遍历序列来判断二叉树是不是对称的,如果两个的序列是一样的,那么二叉树就是对称的。#include <cstdio>#include <iostream>using ...原创 2018-06-27 09:51:33 · 165 阅读 · 0 评论 -
面试题26:树的子结构
一、题目 树的子结构:输入两棵二叉树A和B,判断B是不是A的子结构。 8 8 / \ /...原创 2018-06-26 20:53:54 · 232 阅读 · 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 · 284 阅读 · 0 评论 -
面试题24:反转链表
一、题目 反转链表:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。二、解法 分析: 为了正确的反转一个链表,需要调整链表中指针的方向,如下图,我们在调整i的next指针时,除了需要知道节点i本身,还需要知道i的前一个节点h,因为我们需要把i的next指向节点h,同时,我们还需要先保存i的下一个节点j,以防止链表断开,因此,相应的我们需要定义3个指针,分别指向...原创 2018-06-26 11:10:33 · 196 阅读 · 0 评论 -
面试题23:链表中环的入口节点
一、题目 一个链表中包含环,如何找出环的入口结点?例如,在图的链表中,环的入口结点是结点3。图. 节点3是链表环的入口节点二、解法 分析:解决这个问题第一步是如何确定一个链表中包含环。我们可以定义两个指针,同时从链表头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走的快的指针追上了走得慢的指针,那么链表就包含环;如果走的快的指针走到了链表的末尾都没有追上第一个指针,那么链表...原创 2018-06-26 10:18:07 · 165 阅读 · 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 · 290 阅读 · 0 评论 -
面试题21:调整数组顺序使奇数位于偶数前面
一、题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。二、解法2.1 方法一:最简单思路 分析:如果不考虑时间复杂度和空间复杂度,最简单的思路就是从头扫描这个数组,将奇数放到一个新的数组中,将偶数放在另一个数组中。最后把两个数组拼接到一起。以下用Python实现:class Solution: def ...原创 2018-06-25 10:48:03 · 234 阅读 · 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 · 222 阅读 · 0 评论 -
面试题19:正则表达式匹配
一、题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。二、解法1. 当模式中的第二个字符不是“*”时:如果字符串第一个字符和模式中的第一个字符相...原创 2018-06-25 09:23:39 · 145 阅读 · 0 评论 -
面试题18_2:删除链表中重复的节点
一、题目 删除链表中重复的节点:在一个排序的链表中,如何删除重复的结点?例如,在图(a)中重复 结点被删除之后,链表如图3.4(b)所示。 (a). 1->2->3->3->4->4->5 ...原创 2018-06-24 21:33:22 · 211 阅读 · 0 评论 -
面试题18_1:删除链表的节点
一、题目 在O(1)时间删除链表结点:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) 二、解法 分...原创 2018-06-24 17:35:05 · 441 阅读 · 0 评论 -
面试题17:打印从1到最大的n位数
一、题目 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。二、解法2.1 跳进面试官陷阱 分析:这道题目看起来很简单。我们看到这个问题之后,最容易想到的办法就是先求出最大的n位数,然后用一个循环从1开始逐个打印。于是写出以下代码:void PrintToMaxOfDigits_1(int n){ int number =...原创 2018-06-24 16:37:26 · 1309 阅读 · 0 评论 -
面试题16:数值的整数次方
一、题目 实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。二、解法 分析:由于不需要考虑大数问题,这道题看起来很简单。但是需要特别注意的是:如果输入的指数小于1(0和负数)的时候怎么办?当底数是0且指数是负数的时候怎么处理?2.1 方法一:不够高效的解法#include...原创 2018-06-23 20:28:21 · 158 阅读 · 0 评论 -
面试题15:二进制中1的个数
一、题目 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。二、解法2.1 方法一:常规解法 分析:首先把n和1做与运算,判断n的最低位是不是为1,接着把1左移一位得到2,在和n做与运算,就能判断n的次低位是不是1...这样反复左移,每次都能判断n的其中一位是不是1,基于这样的思路,可以写出代码:i...原创 2018-06-23 17:49:13 · 274 阅读 · 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 · 1442 阅读 · 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 · 283 阅读 · 0 评论 -
面试题12: 矩阵中的路径 (回溯法)
一、题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一...原创 2018-06-23 16:26:34 · 1003 阅读 · 0 评论 -
面试题11:旋转数组的最小数字
一、题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。二、解法分析:这道题最直观的解法很简单那,从头到尾遍历数组一次,就得到了最小的元素,这种思路的时间复杂度显然是O(n),但这种思路没有利用输入的旋转数组的特...原创 2018-06-21 10:54:36 · 154 阅读 · 0 评论 -
斐波那契数列应用──青蛙跳台阶问题
一、题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,求该青蛙跳上一个n级台阶总共有多少种跳法二、解法 分析:首先考虑最简单的情况,如果只有1级台阶,那么显然只有一种跳法;如果有2级台阶,那就有两种跳法:一种是分两次跳,每次跳一级,另一种是一次跳2级。接着我们讨论一般的情况,我们把n级台阶的跳法看成n的函数,记为f(n)。当n>2时,第一次跳的时候就有两种不同的选择:一...原创 2018-06-19 21:45:49 · 653 阅读 · 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 · 1438 阅读 · 1 评论