
剑指offer刷题
记录剑指offer刷题思路以及通过代码,以备复习。
逼疯代码
这个作者很懒,什么都没留下…
展开
-
C++一次性输入连续带空格的数据,以enter键结束
环境:VS2013对于未知数量的数组,不方便使用循环进行输入,因为默认空格为一次输入结束,如2 4 5 67 7 8如何仅使用一次enter便可输入所有的数据,并保存在数组中。代码如下:vector<int> nums; int k = 0; while (cin >> k) { nums.push_back...原创 2020-02-21 10:57:53 · 3743 阅读 · 0 评论 -
牛客网刷题——两组字符串组成回文数的组合数
题目描述“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。例如:A = “...原创 2018-08-15 21:07:32 · 478 阅读 · 0 评论 -
剑指offer--重构二叉树以及三种遍历方式(c++)
剑指offer题目:重建二叉树题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。程序注释:根据题目要求重建二叉树,并加入三种遍历方式输出查看结果。已在vs2013运行通过,函数r...原创 2019-04-26 21:36:26 · 409 阅读 · 0 评论 -
剑指offer-斐波那契数列(C++)
剑指offer--斐波那契数列题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39。思路:第一想法是递归,但是很显然效率太低。斐波那契数列数列规律:当前数等于前两个数之和(n>=2)(第一个数为0,第二个数为1,以此类推)将数据保存下来依次计算到需要的数。vs2013通过程序// Fi...原创 2019-04-27 16:43:59 · 267 阅读 · 0 评论 -
剑指offer 跳台阶以及变态跳台阶,矩阵覆盖问题(C++)
普通跳台阶题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?思路:如果台阶级数大于2,设为n的话,这时我们把n级台阶时的跳法看成n的函数,记为,第一次跳的时候有2种不同的选择:一是第一次跳一级,此时跳法的数目等于后面剩下的n-1级台阶的跳法数目,即为,二是第一次跳二级,此时跳法的数目等于后面剩下的n-2级台阶的跳法数目,即为,因此n级台...原创 2019-04-28 13:46:45 · 271 阅读 · 0 评论 -
剑指offer 数值的整数次方(C++)
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路1:简单粗暴,直接求。底为0或1,则直接返回。指数为负数,则结果为乘积取倒数。指数为0,直接返回1.。这里没有考虑数据无效的情况(底为0,指数为负数)class Solution {public: double Power(double ...原创 2019-04-28 19:13:43 · 323 阅读 · 0 评论 -
剑指offer 调整数组顺序使奇数位于偶数前面(C++)
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路1新建一个动态数组,先将奇数取出来放于其中,后将偶数取出来放于其中。最后将这个数组赋值给原数组。class Solution {public: void reOrderArray(vec...原创 2019-04-29 15:19:02 · 244 阅读 · 0 评论 -
剑指offer 链表中倒数第k个节点(C++)
题目描述输入一个链表,输出该链表中倒数第k个结点。思路1:先对链表遍历,得到链表的长度。再从表头开始遍历n-k步。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ...原创 2019-04-29 17:32:53 · 162 阅读 · 0 评论 -
剑指offer 反转链表(C++)
题目描述输入一个链表,反转链表后,输出新链表的表头。思路1:直观想法:采用堆栈进行反转(常用操作,先进后出嘛)/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Sol...原创 2019-04-30 11:35:55 · 400 阅读 · 0 评论 -
剑指offer 合并两个排序的链表(C++)
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:新建一个链表,对比两个链表,将值较小的那个链接到新链表表尾。(代码采用非递归方法)/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) ...原创 2019-04-30 14:21:53 · 149 阅读 · 0 评论 -
剑指offer 树的子结构(C++)
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:需要遍历所有节点,查看树1是否有和树2根相同数值的节点。如果有,则对根节点进行遍历。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int ...原创 2019-05-06 19:46:38 · 324 阅读 · 0 评论 -
剑指offer 二叉树的镜像(C++)
思路:遍历整个二叉树,遇到非叶子节点则,交换其两个子节点。遇到叶子节点则结束。class Solution {public: void Mirror(TreeNode *pRoot) { if(pRoot == NULL) return; if(pRoot->left==NULL && pRoot->right=...原创 2019-05-08 17:33:53 · 194 阅读 · 0 评论 -
剑指offer 栈的压入、弹出序列(C++)
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:先判断两个序列内数据个数是否相同,不同则返回false。将压入序列的数据...原创 2019-05-09 17:42:16 · 192 阅读 · 0 评论 -
剑指offer 顺时针打印矩阵(C++)
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路:从外向里顺时针打印,每次打印的起点都是[i][i],打印结束的标志为起点值的2倍大于了行数或者列数。...原创 2019-05-13 17:21:19 · 193 阅读 · 0 评论 -
剑指offer 包含min函数的栈(C++)
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。思路:建立一个数据栈,一个辅助栈。数据栈正常存取数据,辅助栈存取最小值。push函数:做入栈操作时,数据栈正常入栈,辅助栈需要对辅助栈栈顶数据与当前输入数据做比较,当前值更小才入辅助栈,为空则直接入栈;pop函数:数据栈正常出栈,如果数据栈栈顶与辅助栈栈顶相同,则两个栈...原创 2019-06-10 16:02:01 · 224 阅读 · 0 评论 -
剑指offer 从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:二叉树的层序遍历,使用队列进行存储,将当前节点存放在队列中,如果有左右节点,则保存在队列中。代码/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x...原创 2019-06-10 16:33:03 · 136 阅读 · 0 评论 -
剑指offer 二叉搜索树的后序遍历序列(C++)
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:二叉搜索树的性质:左子树小于根节点值,右子数大于根节点值。后序遍历序列的最后一个值为根节点,则根据根节点可以将序列分成左右子树。判断依据:左子树的值均小于根,右子树的值均大于根。解题思路:首先遍历序列得到左子树则break,对右...原创 2019-06-10 17:58:43 · 334 阅读 · 0 评论 -
剑指offer 数组中出现次数超过一半的数字(C++)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:超过一半的数,即出现次数超过了所有其它数出现的次数。对数组进行遍历,先保存第一个数,计数器置一,后面的和这个值相比,相同则计算器加一,不同则计数器减一。如果计数器为...原创 2019-06-10 19:24:41 · 507 阅读 · 0 评论