![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
蛋淡的忧伤
小xuo生
展开
-
剑指offer——扑克牌顺子
题目描述:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。解题思路:0的个数>=不连续的个数且不含对子即是顺子从书中的意思来看,这个顺子不是真正的顺子,扑克牌中Q、K、A是顺子,但在这里Q、K、A分别是12、13、1不是顺子,忽略了这第一点题目就简单了。c...原创 2019-11-12 19:06:31 · 112 阅读 · 0 评论 -
剑指offer——空格替换
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路:统计空格个数和原始字符串的长度,计算替换后的长度,然后从后往前复制,这样可以一次性将所有字符移动到最终位置,能减少字符的重复移动。如果从前往后复制,空格越多,越往后面的字符重复移动的次数越多。clas...原创 2019-11-12 11:22:11 · 107 阅读 · 0 评论 -
剑指offer——构建乘积数组**
题目描述给定一个数组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]。不能使用除法。解题思路:B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]可分为C[i] + D[i]C[i] =A[0]*A[1]*......原创 2019-11-13 20:03:12 · 101 阅读 · 0 评论 -
剑指offer——把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1输入+2147483647 1a33输出2147483647 0解题思路:主要...原创 2019-11-13 21:39:25 · 103 阅读 · 0 评论 -
剑指offer——不用加减乘除做加法**
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路:首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果直到他们的进位是0,上述两步的结果是2和1...原创 2019-11-12 21:32:51 · 93 阅读 · 0 评论 -
剑指offer——求1+2+3+…+n
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路:使用递归计算,但由于不能使用if所以终止条件利用&&的特点来实现。res&&(res+=Sum_Solution(n-1)),当res等于0时,&&后面的内容就不需要再判...原创 2019-11-12 20:37:32 · 102 阅读 · 0 评论 -
剑指offer——股票的最大利润*
题目描述:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5,7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。解题思路:每次求以第i个价格出售的最大利润(只能当前价格减去此前的最低价),维护一个最大利润,同时维护一个最低价(...原创 2019-11-12 20:21:22 · 113 阅读 · 0 评论 -
剑指offer——圆圈中最后剩下的数字(孩子们的游戏)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去.....原创 2019-11-12 19:31:26 · 117 阅读 · 0 评论 -
剑指offer——扑克牌顺子
题目描述:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。解题思路:0的个数>=不连续的个数且不含对子即是顺子从书中的意思来看,这个顺子不是真正的顺子,扑克牌中Q、K、A是顺子,但在这里Q、K、A分别是12、13、1不是顺子,忽略了这第一点题目就简单了。c...原创 2020-05-11 10:36:30 · 98 阅读 · 0 评论 -
剑指offer——滑动窗口的最大值**
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,...原创 2019-11-12 18:20:26 · 97 阅读 · 0 评论 -
剑指offer——翻转字符串*
题目一:翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。解题思路:先将整个字符串翻转,在分别把每个单词翻转。class Solution {public: void Reverse(string&...原创 2019-11-12 18:50:44 · 126 阅读 · 0 评论 -
剑指offer——和为S的数字*
题目一:和为S的两个数字输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。解题思路:设置两个指针分别指向数组的首位和末位,如果两个指针指向的数字和大于sum尾指针向前移动一位,若小于sum首指针向后移动一位,若与sum相等表示找到了,保存退出...原创 2019-11-12 11:49:53 · 93 阅读 · 0 评论 -
剑指offer——平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。解题思路:如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { return IsBalanced(pRoot)!=-1; ...原创 2019-11-11 18:51:33 · 72 阅读 · 0 评论 -
剑指offer——二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路:二叉树的深度等于它的左右子树中深度更大的那个值加一/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int ...原创 2019-11-11 18:36:57 · 80 阅读 · 0 评论 -
剑指offer——二叉搜索树的第K个节点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。解题思路:根据二叉搜索树的特性,中序遍历的序列就是从小到大的排序。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode...原创 2019-11-11 18:32:37 · 83 阅读 · 0 评论 -
剑指offer——在排序数组中查找数字
题目一:数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。解题思路:方法一:直接遍历一遍,O(n)的时间复杂度。方法二:二分查找,时间复杂度度更优分别二分查找第一个k的位置和最后一个k的位置class Solution {public: int GetNumberOfK(vector<int> data ,int ...原创 2019-11-11 18:13:10 · 126 阅读 · 0 评论 -
剑指offer——第一个只出现一次的字符
题目一:字符串中第一个只出现一次的字符在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).解题思路:直接打表class Solution {public: int FirstNotRepeatingChar(string str) { i...原创 2019-11-12 08:48:29 · 85 阅读 · 0 评论 -
剑指offer——两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共结点。代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindFirstCommonNod...原创 2019-11-11 17:35:17 · 74 阅读 · 0 评论 -
剑指offer——数组中数字出现的次数
题目一:数组中只出现一次的两个数一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路:方法一:哈希表这个比较容易想到,但是需要额外的空间class Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *...原创 2019-11-11 19:18:53 · 97 阅读 · 0 评论 -
剑指offer——连续子数组的最大和*
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...原创 2019-11-07 19:37:07 · 91 阅读 · 0 评论 -
剑指offer——丑数*
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路:从第一个丑数开始,所有丑数都是由前面的某一个丑数乘以2或者3或者5,要做的是确定他们的大小顺序来得到第n个丑数。找到一个丑数MinUgly后,下一个丑数是之前所有丑数2倍、...原创 2019-11-11 11:40:18 · 98 阅读 · 0 评论 -
剑指offer——二维数组中的查找
题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路:每次从右上角开始查找,如果当前数字大于目标数字,说明要查找的数字可能位于当前数字所在列的左侧;如果当前数字小于目标数字,说明要查找的数字可能位于当前数字所在行的下侧...原创 2019-07-24 14:24:12 · 69 阅读 · 0 评论 -
剑指offer——数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。(类似题目不修改数组找出重复的数字)解题思路:这题常规思路很多,打表(需要O(n)的空间)、排序(O(nlog...原创 2019-07-24 16:43:31 · 87 阅读 · 0 评论 -
剑指offer——不修改数组找出重复的数字
题目描述:在一个长度为n+1的数组里的所有的数字都在1~n的范围内,所以数组中至少有一个数字是重复的请找出数组中任意一个重复的数字,但不能修改输入的数组。例如如果长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或3。解题思路:要求不修改输入的数组,那么上一篇剑指offer——数组中重复的数字中的算法便不能使用了。当然还是可以使用打表的方法做,这...原创 2019-07-25 18:36:50 · 99 阅读 · 0 评论 -
剑指offer——从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。递归即可。class Solution { public: vector<int> printListFromTailToHead(struct ListNode* head) { vector<int> v; solve(head,...原创 2019-07-26 18:57:43 · 93 阅读 · 0 评论 -
剑指offer——重建二叉树**
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路:前序遍历序列的第一个值为根节点,根据这个根节点在中序遍历序列中找到根节点,该节点之前是左子树,之后是右子树,以此递归建立左右子树...原创 2019-11-12 00:38:03 · 103 阅读 · 0 评论 -
剑指offer——二叉树的下一个节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 BinaryTreeNode* GetNext(BinaryTreeNode* pNode) { if(pNode==nullptr) return nullptr; BinaryTreeNode* pNext=nullpt...原创 2019-07-27 15:58:11 · 65 阅读 · 0 评论 -
剑指offer——用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路:每次入队都进入stack1每次出队都出stack2的栈顶,如果stack2为空,将stack1依次弹栈并压入stack2class Solution{public: void push(int node) { stack1.push(no...原创 2019-08-15 14:07:30 · 84 阅读 · 0 评论 -
剑指offer——斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39看到题目后,我用了10S写出如下代码:class Solution {public: int Fibonacci(int n) { if(n == 0) return 0; if(n == 1) retur...原创 2019-08-15 14:44:00 · 71 阅读 · 0 评论 -
剑指offer——跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路:其实就是斐波那契数列。如果1级台阶,1种;如果2级台阶,2种;如果阶数大于2:第一次有两种跳法: 1、跳1阶,跳法为f(n-1) 2、跳2阶,跳法为f(n-2)所以中跳法数为二者之和:class So...原创 2019-08-15 17:47:56 · 59 阅读 · 0 评论 -
剑指offer——变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。结题思路:对n阶台阶,例如3阶台阶,f(3) = f(2) + f(1)若第一次跳1阶,跳法为f(2)若第一次跳2阶, 跳法为f(1)若第一次跳3(共n阶第一次就跳n阶),跳法为1即f(n) = f(n-1) + f(n-2) + …… + f(...原创 2019-08-16 00:03:49 · 72 阅读 · 0 评论 -
剑指offer——铺地板
题目描述我们可以用2x1的小矩形(下左)去横着或竖着覆盖更大的矩形,请问用8个2x1的小矩形无重叠覆盖一个2x8的大矩形(下右),共有多少种方法?解题思路:从左边起覆盖,若第一次小矩形横着覆盖,有f(6)种方法,若第一次小矩形竖着覆盖,有f(7)种方法,即f(n) = f(n-1) + f(n-2)也是属于斐波那契数列 int solve(int n)...原创 2019-08-16 00:33:30 · 171 阅读 · 0 评论 -
剑指offer——旋转数组中的最小数字**
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。两个注意的点:1.将前0个数字移动到后面的情况,即有序数组,特殊处理。2.左中右三个数字相等的情...原创 2019-08-17 13:47:22 · 70 阅读 · 0 评论 -
剑指offer——矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符...原创 2019-08-17 15:50:26 · 100 阅读 · 0 评论 -
剑指offer——机器人的运动范围
题目描述:题目:地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?bool inRange(int r...原创 2019-08-18 01:42:12 · 85 阅读 · 0 评论 -
剑指offer——剪绳子*
题目描述:给你一根长度为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.解题思路:状态转移方程:dp[i]= max(dp[i], f(j...原创 2019-08-19 13:34:03 · 116 阅读 · 0 评论 -
剑指offer——二进制中1的个数
题目描述:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数,例如,9的二进制表示是1001,有两位是1。因此如果输入9,则该函数输出2。解法一:这种解法有一个缺陷,如果n为负数,n的在右移x位后,前x位补1而不是补0,所以如果n是负数,就会陷入死循环。int NumberOf1_Solution(int n){ int count=0; while(n) ...原创 2019-08-19 13:48:44 · 80 阅读 · 0 评论 -
剑指offer——数值的整数次方
题目描述实现函数 double Power(double base, int exponent), 求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。这题主要是注意程序的鲁棒性,核心算法可以使用快速幂算法。更多的快速幂写法 double Power(double base, int exponent) { if(equal(base,0....原创 2019-08-21 22:56:57 · 73 阅读 · 0 评论 -
剑指offer——打印从1到最大的n位数
题目描述:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。解题思路:因为题目没有说明数在什么范围内,所以这是一个大数问题,模拟加一或者用全排列来做解法一:void Print1ToMaxOfNDigits(int n){ if(n<=0) return; int num[n]; memset(...原创 2019-08-21 23:19:14 · 121 阅读 · 0 评论 -
剑指offer——删除链表的节点
题目描述给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。解题思路:传统的删除节点的方法时间复杂度是O(n),为了实现O(1)的复杂度使用如下算法:待删除节点:pToBeDeleted如果待删除节点不是尾节点: 将pToBeDeleted的下一个节点pNext的值赋值给pToBeDeleted,pToBeDeleted的指向p...原创 2019-08-22 12:28:00 · 117 阅读 · 0 评论