![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
愿你慢慢变强
愿你有好运气,如果没有,愿你在不幸中学会慈悲。
愿你被很多人爱,如果没用,愿你在寂寞中学会宽容。
展开
-
剑指Offer——面试题68:树中两个结点的最低公共祖先
面试题68:树中两个结点的最低公共祖先题目:输入两个树结点,求它们的最低公共祖先。一:若树为二叉搜索树#include<iostream>#include<algorithm>#include<vector> using namespace std;struct TreeNode{ int Value; TreeNode* left; Tre...原创 2020-02-27 15:16:28 · 174 阅读 · 0 评论 -
剑指Offer——面试题67:把字符串转换成整数
面试题67:把字符串转换成整数题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。#include<iostream>#include<algorithm>#include<vector> using namespace std;enum Status {kValid=0, kInvali...原创 2020-02-27 12:14:59 · 191 阅读 · 0 评论 -
剑指Offer——面试题66:构建乘积数组
面试题66:构建乘积数组题目:给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i] =A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。#include<iostream>#include<algorithm>#include<vector> using n...原创 2020-02-27 11:00:25 · 141 阅读 · 0 评论 -
剑指Offer——面试题65:不用加减乘除做加法
面试题65:不用加减乘除做加法题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。#include<iostream>#include<algorithm>using namespace std;int Add(int num1, int num2){ int sum, carry; do{ sum=num1^num2...原创 2020-02-26 13:33:23 · 152 阅读 · 0 评论 -
剑指Offer——面试题64:求1+2+…+n
面试题64:求1+2+…+n题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句(A?B:C)。????????解法一:利用构造函数求解#include<iostream>#include<algorithm>#include<list>using namespace std;clas...原创 2020-02-26 12:11:59 · 167 阅读 · 0 评论 -
剑指Offer——面试题63:股票的最大利润
面试题63:股票的最大利润题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5, 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。#include<iostream>#include<algorithm>#in...原创 2020-02-26 11:41:02 · 197 阅读 · 0 评论 -
剑指Offer——面试题62:圆圈中最后剩下的数字
面试题62:圆圈中最后剩下的数字题目:0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0,1,2,3,4 这5个数字组成一个圆圈,从数字 0 开始每次删除第 3 个数字,则删除的前 4 个数字依次是 2、0、4、1,因此最后剩下的数字是3。(有名的约瑟夫环问题)????????经典的解法,用环形链表模拟圆圈#incl...原创 2020-02-26 10:51:38 · 284 阅读 · 0 评论 -
剑指Offer——面试题61:扑克牌的顺子
面试题61:扑克牌的顺子题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。#include<iostream>#include<algorithm>using namespace std;int compare(const void* arg1, cons...原创 2020-02-26 09:37:54 · 162 阅读 · 0 评论 -
剑指Offer——面试题60:n个骰子的点数
面试题60:n个骰子的点数题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。????????解法一:基于递归求骰子点数,时间效率不够高#include<iostream>#include<algorithm>#include<cmath>using namespace std;int g_maxValue=6...原创 2020-02-25 16:22:46 · 183 阅读 · 0 评论 -
剑指Offer——面试题59:队列的最大值
题目一:滑动窗口的最大值题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5}。解决思路:利用双端队列步骤插入数字滑动窗口队列的下标最大值1220(2)N/A232,31...原创 2020-02-25 15:03:26 · 300 阅读 · 0 评论 -
剑指Offer——面试题58:翻转字符串
题目一:翻转单词顺序题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。#include<iostream>using namespace std;void Reverse(char* pBegin, char* pEnd){ ...原创 2020-02-25 12:25:35 · 266 阅读 · 0 评论 -
剑指Offer——面试题57:和为 s 的数字
题目一:和为s的两个数字题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。#include<iostream>#include<algorithm>#include<set>#include<vector>#include<cstring>#in...原创 2020-02-25 11:44:58 · 145 阅读 · 0 评论 -
剑指Offer——面试题56:数组中数字出现的次数
题目一:数组数组中只出现一次的两个数字题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。#include<iostream>#include<algorithm>#include<set>#include<vector>#include<...原创 2020-02-25 11:07:29 · 183 阅读 · 0 评论 -
剑指Offer——面试题55:二叉树的深度
题目一:二叉树的深度题目:输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。#include<iostream>using namespace std;struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode*...原创 2020-02-24 16:29:37 · 130 阅读 · 0 评论 -
剑指Offer——面试题54:二叉搜索树的第k个结点
面试题54:二叉搜索树的第k个结点题目:给定一棵二叉搜索树,请找出其中的第k大的结点。#include<iostream>using namespace std;struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right;};// 二叉搜索树的中序遍历思想 Binary...原创 2020-02-24 15:55:42 · 161 阅读 · 0 评论 -
剑指Offer——面试题53:在排序数组中查找数字
题目一:数字在排序数组中出现的次数题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。#include<iostream>#include<algorithm>#include<set>#include<vector>#include...原创 2020-02-24 15:38:01 · 197 阅读 · 0 评论 -
剑指Offer——面试题52:两个链表的第一个公共结点
面试题52:两个链表的第一个公共结点题目:输入两个链表,找出它们的第一个公共结点。解决思路:方法一:利用栈的特性,分别把两个链表的节点放入两个栈里,这样两个链表的尾节点就位于两个栈的栈顶,接下来比较两个栈顶的节点是否相同。如果相同,则把栈顶弹出接着比较下一个栈顶,直到找到最后一个相同的节点。#include<iostream>#include<algorithm>...原创 2020-02-24 11:55:06 · 147 阅读 · 0 评论 -
剑指Offer——面试题51:数组中的逆序对
面试题51:数组中的逆序对题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)、(5,4)。解决思路:最直观的解法#include<iostream>using namespace std;...原创 2020-02-24 10:59:53 · 305 阅读 · 0 评论 -
剑指Offer——面试题50:第一个只出现一次的字符
面试题50:第一个只出现一次的字符题目一:字符串中第一个只出现一次的字符。在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出’b’#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int TABLE_SIZE=256...原创 2020-02-23 17:16:30 · 227 阅读 · 0 评论 -
剑指Offer——面试题49:丑数
面试题49:丑数题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。解决方法♞逐个判断每个整数是不是丑数的解法,直观但不够高效#include<iostream>#include<algorithm>#include<s...原创 2020-02-23 15:37:26 · 173 阅读 · 0 评论 -
剑指Offer——面试题48:最长不含重复字符的子字符串
面试题48:最长不含重复字符的子字符串题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。例如,在字符串"arabcacfr"中,最长的不含重复字符的子字符串是"acfr",长度为4。...原创 2020-02-23 14:05:52 · 248 阅读 · 0 评论 -
剑指Offer——面试题47:礼物的最大价值
面试题47:礼物的最大价值题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?例如,在下面的棋盘中,如果沿着带下划线的数字的线路(1、12、5、7、7、16、5),那么我们能拿到最大价值为53的礼物。这是一个...原创 2020-02-23 12:14:18 · 207 阅读 · 0 评论 -
剑指Offer——面试题46:把数字翻译成字符串
面试题46:把数字翻译成字符串题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",……,11翻译成"l",……,25翻译成"z"。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是"bccfi"、“bwfi”、“bczi”、“mcfi"和"mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。#include<iostrea...原创 2020-02-23 10:59:03 · 168 阅读 · 0 评论 -
剑指Offer——面试题45:把数组排成最小的数
面试题45:把数组排成最小的数题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。#include<iostream>#include<algorithm>#include<set>#include<vector&g...原创 2020-02-22 18:31:30 · 141 阅读 · 0 评论 -
剑指Offer——面试题44:数字序列中某一位的数字
面试题44:数字序列中某一位的数字题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。解决方法:我们用一个具体的例子来分析如何解决这个问题。比如,序列的第1001位是什么? 序列的前10位是0~9这10个只有一位的数字。显然第1001位在这10个数字...原创 2020-02-22 16:54:16 · 145 阅读 · 0 评论 -
剑指Offer——面试题43:从1到n整数中1出现的次数
面试题43:从1到n整数中1出现的次数题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。解决方法:◈不考虑时间效率的解法,靠它想拿到 Offer 有点难#include<iostream>#include<algorithm>#include<...原创 2020-02-22 15:10:36 · 188 阅读 · 0 评论 -
剑指Offer——面试题42:连续子数组的最大和
面试题42:连续子数组的最大和题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如,输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。解决方法解法一:举例分析数组的规律#include<iostream>...原创 2020-02-22 14:36:36 · 352 阅读 · 0 评论 -
剑指Offer——面试题41:数据流中的中位数
面试题41:数据流中的中位数题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。使用没有排序的数组、排序的数组、排序的链表、二叉搜索树、AVL树、最大堆和最小堆等不同数据结构的时间复杂度数据结构插入的时间复杂度得到中位数的时间复杂度...原创 2020-02-22 14:09:15 · 148 阅读 · 0 评论 -
剑指Offer——面试题40:最小的k个数
面试题40:最小的k个数题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。解决思路这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这种思路的时间复杂度是O(nlogn)。解法一:时间复杂度为O(n)的算法,只有当我们可以修改输入的数组时可用#include<io...原创 2020-02-22 11:21:09 · 223 阅读 · 1 评论 -
剑指Offer——面试题39:数组中出现次数超过一半的数字
面试题39:数组中出现次数超过一半的数字题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。#include<iostream>#include<algorithm>using namespace std;...原创 2020-02-21 21:39:48 · 195 阅读 · 0 评论 -
剑指Offer——面试题38:字符串的排列
面试题38:字符串的排列题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。#include<iostream>using namespace std;void Permutation(char *pStr, char *pBegin){ if(*pBegi...原创 2020-02-21 19:32:26 · 1393 阅读 · 0 评论 -
剑指Offer——面试题37:序列化二叉树
面试题37:序列化二叉树题目:请实现两个函数,分别用来序列化和反序列化二叉树。#include<iostream>using namespace std;struct BinaryTreeNode { int value; BinaryTreeNode* left; BinaryTreeNode* right;};// 序列化 void Serialize(Bin...原创 2020-02-21 17:48:25 · 140 阅读 · 0 评论 -
剑指Offer——面试题36:二叉搜索树与双向链表
面试题36:二叉搜索树与双向链表题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如,输入下图中左边的二叉搜索树,则输出转换之后的排序双向链表。#include<iostream>using namespace std;struct BinaryTreeNode { int value; Binary...原创 2020-02-21 16:03:25 · 272 阅读 · 0 评论 -
剑指Offer——面试题35:复杂链表的复制
面试题35:复杂链表的复制题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。解决方案:第一步:复制原始链表的任意节点N并创建新节点N’,再把N’链接到N的后面。第二步:如果...原创 2020-02-21 14:37:37 · 134 阅读 · 0 评论 -
剑指Offer——面试题34:二叉树中和为某一值的路径
面试题34:二叉树中和为某一值的路径题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。#include<iostream>#include<vector>using namespace std;struct BinaryTreeNode { int value; Binar...原创 2020-02-21 12:46:48 · 172 阅读 · 0 评论 -
剑指Offer——面试题33:二叉搜索树的后序遍历序列
面试题33:二叉搜索树的后序遍历序列题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如,输入数组{5,7,6,9,11,10,8},则返回true,因为这个整数序列是下图二叉搜索树的后序遍历结果。如果输入的数组是{7,4,6,5},则由于没有哪棵二叉搜索数的后序遍历结果是这个序列,因此返回f...原创 2020-02-21 11:52:25 · 936 阅读 · 0 评论 -
剑指Offer——面试题32:从上到下打印二叉树
面试题32:从上到下打印二叉树题目一:不分行从上到下打印二叉树从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如,下图中的二叉树,则依次打印出 8,6,10,5,7,9,11。#include<iostream>#include<queue>using namespace std;struct BinaryTreeNode{ int v...原创 2020-02-20 18:44:11 · 146 阅读 · 0 评论 -
剑指Offer——面试题31:栈的压入、弹出序列
面试题31:栈的压入、弹出序列题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。...原创 2020-02-20 18:11:44 · 224 阅读 · 1 评论 -
剑指Offer——面试题30:包含min函数的栈
面试题30:包含min函数的栈题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。步骤操作数据栈辅助栈最小值1压入33332压入43,43,333压入23,4,23,3,224压入13,4,2,13,3,2,115弹出3...原创 2020-02-20 16:04:03 · 122 阅读 · 0 评论 -
剑指Offer——面试题29:顺时针打印矩阵
面试题29:顺时针打印矩阵题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。#include <iostream>#include <algorithm>#include <cmath>#include <cstring>using namespace std;void PrintMatrixInCircle(int...原创 2020-02-20 15:09:04 · 235 阅读 · 0 评论