![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指OFFER
YangLei253
这个作者很懒,什么都没留下…
展开
-
字符串中第一个只出现一次的字符
题目描述在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出b。如果字符串中不存在只出现一次的字符,返回#字符。样例Input:"abaccdeff"Output:'b'解题思路描述本题目就是一个简单的模拟题。首先统计各字符出现次数,然后找到第一个出现次数为一的字符,返回即可。实现代码:/*包含头文件:#include <unord...原创 2019-05-07 21:39:50 · 354 阅读 · 0 评论 -
不分行从上往下打印二叉树
题目描述从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。样例Input: [8, 12, 2, null, null, 6, null, 4, null, null, null]Output:[8, 12, 2, 6, 4]解题思路描述就是树的层次遍历实现代码:vector<int> printFromTopToBottom(TreeNo...原创 2019-04-24 19:59:44 · 157 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列。...原创 2019-04-24 19:40:42 · 156 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设数组非空,并且一定存在满足条件的数字。思考题:假设要求只能使用 O(n)O(n) 的时间和额外 O(1)O(1) 的空间,该怎么做呢?样例Input:[1,2,1,1,3]Output:1解题思路描述本题目构思十分巧妙,主要在于如何使用“数字出现次数超过数组长度的一半”这一条件。我们定义一个c...原创 2019-04-28 22:51:40 · 117 阅读 · 0 评论 -
数字排列
题目描述输入一组数字(可能包含重复数字),输出其所有的排列方式。样例Input:[1,2,3]Output:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]解题思路描述本题目就是使用暴力搜索。由于存在重复数...原创 2019-04-28 22:40:15 · 199 阅读 · 0 评论 -
序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。样例Input: 8 / \ 12 2 / \ 6 4Output:[8 12 2 null null 6 4 null null null null]解题思路描述本题目就是使用某一种方式同时实现创建二叉树和遍...原创 2019-04-28 20:27:51 · 93 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。注意:需要返回双向链表最左侧的节点样例输入如下二叉搜索树,返回结果如下:解题思路描述很明显,这道题需要使用到递归,但是如果构造递归函数则是一个比较麻烦的事情。根据样例可以得知,调整点在于左子树、根节点、右子树。对于根节点需要将其与左子树最右的节点连接...原创 2019-04-28 17:02:04 · 131 阅读 · 0 评论 -
包含min函数的栈
题目描述设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例minStack.push(-1);minStack.push(3);minStack.push(-4);minStack.getMin(); --> ...原创 2019-04-23 22:38:05 · 118 阅读 · 0 评论 -
顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。样例Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ]Output: [1,2,3,4,8,12,11,10,9,5,6,7]解题思路描述按照要求指定顺序输出即可。但是这里有两个难点:如何控制上下左右输出。——使用经典技巧,...原创 2019-04-23 20:38:04 · 117 阅读 · 0 评论 -
对称的二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。样例Input: 1 / \ 2 2 / \ / \3 4 4 3Output: true解题思路普通思路描述假定例子中两个2节点记为A,B,要满足对称二叉树,A的左子树需和B的右子树相等,A的右子树需和B的左子树相等。实现代码:...原创 2019-04-23 20:07:17 · 98 阅读 · 0 评论 -
二叉树的镜像
题目描述输入一个二叉树,将它变换为它的镜像。样例Input: 8 / \ 6 10 / \ / \ 5 7 9 11Output: 8 / \ 10 6 / \ / \ 11 9 7 5解题思路普通思路描述根据例子可以知道,对每一个节点,将左右子树交换即可。实现代码:/*st...原创 2019-04-23 19:42:38 · 126 阅读 · 0 评论 -
树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。我们规定空树不是任何树的子结构。样例Input: A树 B树 8 8 / \ / \ 8 7 9 2 / \ 9 2 / \...原创 2019-04-23 19:11:40 · 91 阅读 · 0 评论 -
最小的k个数
题目描述输入n个整数,找出其中最小的k个数。注意:数据保证k一定小于等于输入数组的长度;输出数组内元素请按从小到大顺序排序;样例Input:[1,2,3,4,5,6,7,8] , k=4Output:[1,2,3,4]解题思路描述我们定义一个count用于计数,一个val用于存储计数的数字。遍历数组,如果count为0,则将当前值赋值val,然后count++;如果c...原创 2019-04-29 15:44:22 · 412 阅读 · 0 评论 -
分行从上往下打印二叉树
题目描述从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。样例Input: [8, 12, 2, null, null, 6, null, 4, null, null, null]Output:[[8], [12, 2], [6], [4]]解题思路描述同样是树的层次遍历。在初始化时,加入root和NULL两个节点。当出队元素为NULL,表明一层结束...原创 2019-04-24 21:05:52 · 205 阅读 · 0 评论 -
丑数
题目描述我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。求第n个丑数的值。样例Input:5Output:5解题思路描述本题目可以从前往后一个一个判别,但是这是十分浪费时间的。我们可以通过多路归并的方式快速得到结果。首先看一个简单的问题——求取所有含有2,3,5为因子的数的集合。我们定义三个序列,一个...原创 2019-05-07 21:19:07 · 186 阅读 · 0 评论 -
最长不含重复字符的子字符串
题目描述请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。样例Input:"abcabc"Output:3解题思路描述本题目可使用双指针算法。使用两个指针 i 和 j ,i 和 j 之间维护的是不包含重复字符的子字符串。判断是否包含重复字符,可使用哈希表。实现代码:/*包含头文件:#incl...原创 2019-05-07 16:43:13 · 114 阅读 · 0 评论 -
礼物的最大价值
题目描述在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?注意:m,n>0样例Input:[ [2,3,1], [1,7,1], [4,6,1] ]Output:1...原创 2019-05-06 21:21:07 · 118 阅读 · 0 评论 -
把数字翻译成字符串
题目描述给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。样例Input:"12258"Output:5解题思...原创 2019-05-06 20:54:07 · 217 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。样例Input:[3, 32, 321]Output:321323解题思路描述这个题目有一个十分巧妙的做法。我们对该数组从小到大排序即可,但是这个排序不是普通意义上的排序,需要自定义。我们...原创 2019-05-06 20:15:17 · 134 阅读 · 0 评论 -
数字序列中某一位的数字
题目描述数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。样例Input:13Output:1解题思路描述我们的思路是这样的:输入第n位,我们先找到该位是一个几位数,然后找到这是哪一个数,最后找到是这个数的第几位。举例说明:输入100...原创 2019-05-06 13:08:05 · 174 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。样例Input: [4, 8, 6, 12, 16, 14, 10]Output:true解题思路描述关于二叉搜索树的后序遍历的顺序为“左右根”,而且左子树各节点值小于根节点,右子树各节点值大于根节点。递归判断即可。...原创 2019-04-25 15:43:23 · 127 阅读 · 0 评论 -
从1到n整数中1出现的次数
题目描述输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含“1”的数字有1,10,11和12,其中“1”一共出现了5次。样例Input:12Output:5解题思路描述这种题目需要找统计规律。假定一个整数为"abcdef"。统计千位(即c)为1出现的次数。ab位取值"00 - (ab-1)",def位取值"000 -...原创 2019-04-29 19:55:29 · 181 阅读 · 0 评论 -
连续子数组的最大和
题目描述输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例Input:[1, -2, 3, 10, -4, 7, 2, -5]Output:18解题思路描述这种题目一看就是动态规划,难点在于如何定义数组元素的意义和状态转换。假定动态规划数组为s[n+1]。s[i]...原创 2019-04-29 17:47:43 · 130 阅读 · 0 评论 -
数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。样例Input:1, 2, 3, 4Output:1,1.5,2,2.5## 解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。解题思路描述我们定义一个count用于...原创 2019-04-29 16:53:08 · 190 阅读 · 0 评论 -
之字形打印二叉树
题目描述请实现一个函数按照之字形顺序从上向下打印二叉树。即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。样例Input: [8, 12, 2, null, null, 6, null, 4, null, null, null]Output:[[8], [2, 12], [6, 4]]解题思路描述同样是树的层次遍历。...原创 2019-04-24 21:24:11 · 116 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序。样例Input: 1->3->5 , 2->4->5Output: 1->2->3->4->5->5解题思路普通思路描述就是归并排序的一次简单实现。实现代码:/*struct ListNode { int val; str...原创 2019-04-22 22:52:39 · 91 阅读 · 0 评论 -
反转链表
题目描述定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。样例Input: 1->2->3->4->5->NULLOutput: 5->4->3->2->1->NULL解题思路普通思路描述新建一个链表头结点,每次取出原链表第一个元素,放到新建链表第一个元素的位置。实现代码:/*st...原创 2019-04-22 22:38:39 · 80 阅读 · 0 评论 -
机器人的运动范围
题目描述地上有一个 mmm 行和 nnn 列的方格,横纵坐标范围分别为 0∼m−10 \sim m-10∼m−1 和0∼n−10 \sim n-10∼n−1 。一个机器人从坐标 (0,0)(0,0)(0,0) 的格子开始移动,每一次只能向左、右、上、下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 kkk 的格子。请问该机器人能够到达多少格子?样例Input: k = 7, m...原创 2019-04-21 13:41:37 · 114 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干元素搬到数组末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。数组可能包含重复项。注意:数组内所含元素非负,若数组大小为0,请返回-1。样例Input: nums = [2,2,2,0,1]Output: 0解题思路普通思路...原创 2019-04-13 18:08:04 · 95 阅读 · 0 评论 -
斐波那契数列
下面有彩蛋题目描述输入一个整数n,求斐波那契数列的第n项。假定从0开始,第0项为0。(n≤39)(n \leq 39)(n≤39)样例Input: n = 5Output: 5解题思路普通思路描述使用递推+滚动变量的做法。实现代码:int F(int n){ int tmp1 = 0, tmp2 = 1; // while循环条件比较...原创 2019-04-13 16:19:00 · 218 阅读 · 0 评论 -
用两个栈实现队列
题目描述请用栈实现一个队列,支持如下四种操作:push(x) - 将原始x插入队尾;pop() - 将队首的元素弹出,并返回该元素;peek() - 返回队首元素;empty() - 返回队列是否为空;注意:你只能使用栈的标准操作:push、pop、empty和top;如果你选择的编程语言没有栈的标准库,你可以使用list或者queue等模拟栈的操作;输入数据保证合法,例如...原创 2019-04-13 09:45:20 · 333 阅读 · 0 评论 -
二叉树的下一个节点
题目描述输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。注意:如果给定的节点是中序遍历序列的最后一个节点,则返回空节点;二叉树一定不为空,且给定的节点一定不是空节点样例假定二叉树为:[2,1,3,null.null,null,null]Input: 值等于2的节点Output: 值等于3的节点该的二叉树如下所示: 2 / \ 1 3...原创 2019-04-12 22:33:11 · 102 阅读 · 0 评论 -
重建二叉树
下面有彩蛋题目描述输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。注意:二叉树中每个节点的值都互不相同;输入的前序遍历和中序遍历一定合法;样例Input: 前序遍历:[3,9,20,15,7]中序遍历:[9,3,15,20,7]Output: [3,9,20,null,null,15,7,null,null,null,null]返回的二叉树如下所示: ...原创 2019-04-12 20:23:07 · 125 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。返回结果用数组存储。样例Input: [2,3,5]Output: [5,3,2]解题思路普通思路描述遍历链表并使用vector存储,翻转该数组,返回即可。实现代码:/*使用到的头文件#include <vector>结构体struct ListNode { int val...原创 2019-04-12 17:21:19 · 100 阅读 · 0 评论 -
替换空格
题目描述请实现一个函数,把字符串中的每个空格替换成"%20"。你可以假定输入字符串的长度最大是1000。注意输出字符串的长度可能大于1000。样例Input: "We are happy."Output: "We%20are%20happy."解题思路普通思路描述使用string相关函数即可。实现代码:/*使用到的头文件#include <strin...原创 2019-04-12 14:50:53 · 90 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。样例Input: nums[][] = [ [1,2,8,9] [2,4,9,12] [4,7,10,13] [6,8,11,15] ]如果输入查找值为7,则返回tr...原创 2019-04-12 13:54:14 · 81 阅读 · 0 评论 -
不修改数组找出重复的数字
不修改数组找出重复的数字下面有彩蛋题目描述给定一个长度为n + 1的整数数组nums,数组中所有的数字都在1~n范围内,其中 n≥1n \geq 1n≥1。请找出数组中任意一个重复的数字,但不能修改输入的数组。注意:如果某些数字不在0~n-1的范围内,或数组中不包含重复数字,则返回-1。样例Input: nums = [2,3,5,4,3,2,6,7]Output: 2或3 ...原创 2019-04-12 12:13:49 · 153 阅读 · 0 评论 -
找出数组中重复的数字
找出数组中重复的数字题目描述给定一个长度为n的整数数组nums,数组中所有的数字都在0~n-1范围内,数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。注意:如果某些数字不在0~n-1的范围内,或数组中不包含重复数字,则返回-1。样例Input: nums = [2,3,5,4,3,2,6,7]Output: 2或3 解...原创 2019-04-11 23:31:59 · 177 阅读 · 0 评论 -
剪绳子
题目描述给你一根长度为 nnn 的绳子,请把绳子剪成 mmm 段 (m,n都是整数,2≤n≤58并且m≥2)(m,n都是整数,2 \leq n \leq 58 并且 m \geq 2)(m,n都是整数,2≤n≤58并且m≥2) 。每段的绳子的长度记为k[0]、k[1]、k[2]、……、k[m-1]。k[0]k[1]k[2]……k[m-1]可能的最大乘积是多少?样例Input: 8Outpu...原创 2019-04-21 16:17:13 · 135 阅读 · 0 评论 -
矩阵中的路径
题目描述请设计一个函数,用于判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左、向右、向上、向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。注意:输入的路径不为空所有出现的字符均为大写英文字母样例matrix = [ ['A','B','C','E'] ['S','F'...原创 2019-04-13 20:08:10 · 90 阅读 · 0 评论