剑指offer题解 C++版
剑指offer题解 C++版
zhb1nk
字节跳动前端工程师
展开
-
剑指offer 51. 字符串中第一个只出现一次的字符
在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出b。如果字符串中不存在只出现一次的字符,返回#字符。样例:输入:"abaccdeff"输出:'b'class Solution {public: char firstNotRepeatingChar(string s) { unordered_map<char, int>...原创 2019-01-27 22:37:12 · 212 阅读 · 0 评论 -
剑指offer 50. 丑数
我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。求第n个丑数的值。样例输入:5输出:5注意:习惯上我们把1当做第一个丑数。class Solution {public:priority_queue<long long, vector<long long>, greater<long lo...原创 2019-01-27 22:36:58 · 204 阅读 · 0 评论 -
剑指offer 49. 最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。样例输入:"abcabc"输出:3class Solution {public: unordered_map<char, int> hash; int longestSubstringWithoutDuplication(string...原创 2019-01-27 22:36:41 · 126 阅读 · 0 评论 -
剑指offer 48. 礼物的最大价值
在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?注意:m,n>0样例:输入:[ [2,3,1], [1,7,1], [4,6,1]]输出:19解释:沿着路径 2→3→7→6→1...原创 2019-01-27 22:35:52 · 156 阅读 · 0 评论 -
剑指offer 47. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。样例输入:"12258"输出:5dfsclass Sol...原创 2019-01-27 22:35:28 · 222 阅读 · 0 评论 -
剑指offer 46. 把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。样例输入:[3, 32, 321]输出:321323注意:输出数字的格式为字符串。有时间要用Trie做一下啊class Solution {public: vector<string>...原创 2019-01-27 22:35:04 · 209 阅读 · 0 评论 -
剑指offer 45. 数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。样例输入:13输出:1class Solution {public: int digitAtIndex(int n) { if(n<=9){ ...原创 2019-01-27 22:34:39 · 298 阅读 · 0 评论 -
剑指offer 33. 之字形打印二叉树
请实现一个函数按照之字形顺序从上向下打印二叉树。即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null] 8 / \ 12 2 / \ 6 4输出:[[8], [2, ...原创 2019-01-11 23:37:26 · 280 阅读 · 0 评论 -
剑指offer 32. 分行从上往下打印二叉树
从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 / 4输出:[[8], [12, 2], [6], [4]]/** * Definition for...原创 2019-01-11 23:36:58 · 378 阅读 · 0 评论 -
剑指offer 31. 不分行从上往下打印二叉树
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。样例输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 / 4输出:[8, 12, 2, 6, 4]前序,中序,后序都可以看作是DFS,用栈实现,因为他们都是在找到叶...原创 2019-01-11 22:12:22 · 181 阅读 · 0 评论 -
剑指offer 30. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。注意:若两个序列为空或长度不等则视为并不是一个栈的压入、弹出序列。样例输入:[1,2,3,4,5] [4,5,...原创 2019-01-11 22:06:17 · 197 阅读 · 0 评论 -
剑指offer 29.包含min函数的栈
设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例MinStack minStack = new MinStack();minStack.push(-1);minStack.push(3);minStack.push(-4);...原创 2019-01-10 23:22:05 · 234 阅读 · 0 评论 -
剑指offer 28.顺时针打印矩阵
设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。push(x)–将元素x插入栈中pop()–移除栈顶元素top()–得到栈顶元素getMin()–得到栈中最小元素样例MinStack minStack = new MinStack();minStack.push(-1);minStack.push(3);minStack.push(-4);...原创 2019-01-10 23:21:00 · 148 阅读 · 0 评论 -
剑指offer 27. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。样例如下图所示二叉树[1,2,2,3,4,4,3,null,null,null,null,null,null,null,null]为对称二叉树: 1 / \ 2 2 / \ / \3 4 4 3如下图所示二叉树[1,2,2,null,4,4,3,null,null,...原创 2019-01-10 21:22:57 · 165 阅读 · 0 评论 -
剑指offer 26. 二叉树的镜像
输入一个二叉树,将它变换为它的镜像。样例输入树: 8 / \ 6 10 / \ / \ 5 7 9 11 [8,6,10,5,7,9,11,null,null,null,null,null,null,null,null] 输出树: 8 / \ 10 6 / \ / \ 11 9 7 5 [8,1...原创 2019-01-10 21:14:57 · 164 阅读 · 0 评论 -
剑指offer 25. 树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。我们规定空树不是任何树的子结构。样例树A: 8 / \ 8 7 / \ 9 2 / \ 4 7树B: 8 / \ 9 2返回 true ,因为B是A的子结构。递归/** * Definition for a binary tree node. * stru...原创 2019-01-10 21:14:28 · 104 阅读 · 0 评论 -
剑指offer 24. 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。样例输入:1->3->5 , 2->4->5输出:1->2->3->4->5->5二路归并,时间复杂度O(n)O(n)O(n)/** * Definition for singly-linked list. * struct ListNode { ...原创 2019-01-10 20:43:32 · 167 阅读 · 0 评论 -
剑指offer 23. 反转链表
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。样例输入:1-&gt;2-&gt;3-&gt;4-&gt;5-&gt;NULL输出:5-&gt;4-&gt;3-&gt;2-&gt;1-&gt;NULL非递归方法:/** * Definition for singly-linked list. * struct原创 2019-01-10 20:28:00 · 140 阅读 · 2 评论 -
剑指offer 22. 表中环的入口节点
给定一个链表,若其中包含环,则输出环的入口节点。若其中不包含环,则输出null。样例给定链表:则输出环的入口节点3.很巧的做法啊/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : v...原创 2019-01-06 19:15:43 · 182 阅读 · 0 评论 -
剑指offer 21. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个结点。注意:k >= 0;如果k大于链表长度,则返回 NULL;样例输入:链表:1->2->3->4->5 ,k=2输出:4可以用两个相同的指针实现。判断是否出界与找第k个节点两个操, 降低时间复杂度/** * Definition for singly-linked list. * struct Lis...原创 2019-01-05 22:42:21 · 130 阅读 · 0 评论 -
剑指offer 20. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。要求保证奇数和奇数,偶数和偶数之间的相对位置不变。样例输入:[1,2,3,4,5]输出: [1,3,5,2,4]时间复杂度最快是O(n)O(n)O(n)class Solution {public: void reOrderArray(vector&l...原创 2019-01-05 22:41:48 · 168 阅读 · 0 评论 -
剑指offer 19 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。注意:小数可以没有整数部分,例如.123等于0.123;小数点后面可以没有数字,例如233.等于233.0;小数点前面和后面可以有数字原创 2019-01-05 22:41:29 · 191 阅读 · 0 评论 -
剑指offer 18 正则表达式匹配
请实现一个函数用来匹配包括’.‘和’*'的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。样例输入:s="aa"p="a*"输出:trueclass原创 2019-01-05 22:41:05 · 199 阅读 · 0 评论 -
剑指offer 17. 删除链表中的重复节点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。样例1输入:1->2->3->3->4->4->5输出:1->2->5样例2输入:1->1->1->2->3输出:2->3用两个指针找到重复的起点与结束点/** * Definition for singly-link...原创 2019-01-05 22:40:34 · 110 阅读 · 0 评论 -
剑指offer 16. 在O(1)时间删除链表节点
给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。假设链表一定存在,并且该节点一定不是尾节点。样例输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节点为第0个节点)输出:新链表 1->4->8/** * Definition for singly-linked list. * struct ListNode...原创 2019-01-04 23:00:04 · 310 阅读 · 0 评论 -
剑指offer 15. 数值的整数次方
实现函数double Power(double base, int exponent),求base的 exponent次方。不得使用库函数,同时不需要考虑大数问题。注意:不会出现底数和指数同为0的情况样例1输入:10 ,2输出:100样例2输入:10 ,-2 输出:0.01class Solution {public: double Power(double ...原创 2019-01-04 22:58:48 · 204 阅读 · 0 评论 -
剑指offer 14. 二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。例如,将9表示为二进制是1001,有2位是1,因此,如果输入为9,输出应当为2。样例输入:9输出:2这道题需要考虑负数,负数为补码法1:class Solution {public: int NumberOf1(int n) { int ans = 0; for(int i = 0; i <...原创 2019-01-04 22:57:58 · 167 阅读 · 1 评论 -
剑指offer 13. 剪绳子
给你一根长度为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。样例输入:8输出:18class Solution {public: int maxPr...原创 2019-01-04 22:57:38 · 213 阅读 · 0 评论 -
剑指offer 12. 机器人的活动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。但是不能进入行坐标和列坐标的数位之和大于k 的格子。请问该机器人能够达到多少个格子?样例1输入:k=7, m=4, n=5输出:20样例2输入:k=18, m=40, n=40输出:1484解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7...原创 2019-01-02 11:28:49 · 195 阅读 · 0 评论 -
剑指offer 11. 矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。注意:输入的路径不为空;所有出现的字符均为大写英文字母;样例matrix=[ ['A','B','C','E'], ['S','F','C'...原创 2019-01-02 11:28:34 · 131 阅读 · 0 评论 -
剑指offer 10. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。数组可能包含重复项。注意:数组内所含元素非负,若数组大小为0,请返回-1。样例输入:nums=[2,2,2,0,1]输出:0要找的点p满足这样的条件:p点之前的点都大于num...原创 2019-01-02 11:28:11 · 141 阅读 · 0 评论 -
剑指offer 9. 斐波那契数列
输入一个整数 n ,求斐波那契数列的第 n 项。假定从0开始,第0项为0。(n&amp;lt;=39)样例输入整数 n=5 返回 5滚动数组时间复杂度O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)class Solution {public: int Fibonacci(int n) { // 0 1 1 2 3 5 int num...原创 2019-01-01 16:23:22 · 226 阅读 · 0 评论 -
剑指offer 8. 用两个栈实现队列
请用栈实现一个队列,支持如下四种操作:push(x) – 将元素x插到队尾;pop(x) – 将队首的元素弹出,并返回该元素;peek() – 返回队首元素;empty() – 返回队列是否为空;注意:你只能使用栈的标准操作:push to top,peek/pop from top, size 和 is empty;如果你选择的编程语言没有栈的标准库,你可以使用list或者d...原创 2019-01-01 16:11:46 · 295 阅读 · 0 评论 -
剑指offer 7. 二叉树的下一个节点
给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。注意:如果给定的节点是中序遍历序列的最后一个,则返回空节点;二叉树一定不为空,且给定的节点一定不是空节点;样例假定二叉树是:[2, 1, 3, null, null, null, null], 给出的是值等于2的节点。则应返回值等于3的节点。解释:该二叉树的结构如下,2的后继节点是3。 2 / \1 3...原创 2019-01-01 16:11:26 · 225 阅读 · 0 评论 -
剑指offer 6. 重建二叉树
输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。注意:二叉树中每个节点的值都互不相同;输入的前序遍历和中序遍历一定合法;样例给定:前序遍历是:[3, 9, 20, 15, 7]中序遍历是:[9, 3, 15, 20, 7]返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]返回的二叉树如下所示: 3...原创 2019-01-01 16:11:10 · 158 阅读 · 0 评论 -
剑指offer 5. 从尾到头打印链表
输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。返回的结果用数组存储。样例输入:[2, 3, 5]返回:[5, 3, 2]返回逆序可以对原数组逆序 reverse(res.begin(), res.end())也可以直接构造一个逆序数组 vector<int>(res.rbegin(), res.rend())/** * Definition for si...原创 2019-01-01 16:10:53 · 167 阅读 · 0 评论 -
剑指offer 4. 替换空格
请实现一个函数,把字符串中的每个空格替换成"%20"。你可以假定输入字符串的长度最大是1000。注意输出字符串的长度可能大于1000。样例输入:"We are happy."输出:"We%20are%20happy."不开额外空间的做法会使字符串长度总在变化,会比较麻烦。class Solution {public: string replaceSpaces(strin...原创 2019-01-01 16:10:33 · 193 阅读 · 0 评论 -
剑指offer 3. 二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。样例输入数组:[ [1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15]]如果输入查找数值为7,则返回true,如果输入查找数值为5,则返回false。数组...原创 2019-01-01 16:09:25 · 184 阅读 · 0 评论 -
剑指offer 2. 不修改数组找出重复的数字
给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。请找出数组中任意一个重复的数,但不能修改输入的数组。样例给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 3。思考题:如果只能使用 O(1) 的额外空间,该怎么做呢?把数组分为 [l,mid] 和 [mid+1,r] 两个区间,则必有一个区间数的个数大于区间...原创 2019-01-01 16:09:01 · 367 阅读 · 0 评论 -
剑指offer 1. 找出数组中重复的数字
给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,则返回 -1;样例给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 3。常规做法...原创 2019-01-01 16:08:27 · 304 阅读 · 0 评论