剑指offer
shower_v
慢慢进步的小菜鸟
展开
-
牛客网_剑指offer_用两个栈实现队列_c++
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路:解题思路十分简单,也就是要用两个栈模拟一个队列的操作,在没有想清楚思路之前不要写代码。具体思路,首先必定会需要一个栈1来push元素,然后栈底是先输入的元素,栈顶是后输入的元素,然后当需要pop的时候我们需要先pop栈1最底下的元素,那么,我们将栈1的元素,从栈顶一个一个全放到栈2中,这个时...原创 2019-04-23 11:06:58 · 193 阅读 · 0 评论 -
牛客网_剑指offer_栈的压入、弹出序列_c++
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题思路既然是考察是不是正确的弹出序列,那就模拟一遍真实操作即可,将pushV中的序...原创 2019-05-05 22:24:41 · 143 阅读 · 0 评论 -
牛客网_剑指offer_从上往下打印二叉树_c++
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路这道题的思路就是一层一层的处理,只需要定义一个临时的存放TreeNode*的vector即可,然后把root放进去,然后开始循环,把最前面的指针的左右节点push进来,把最前面节点的val给push进res中去,然后删去最前面的指针,一直到最终这个临时的vector为空为止,则完成了一次按顺序来的遍历。具体代码如下:/...原创 2019-05-05 22:38:26 · 222 阅读 · 0 评论 -
牛客网_剑指offer_数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路解题思路分为两步;1.令count = 0;对数组进行遍历,当count=0的时候,tmp等于当前遍历的值,count++,当当前遍历的值等于tmp的时候,count...原创 2019-05-08 16:07:15 · 111 阅读 · 0 评论 -
牛客网_剑指offer_最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路保持一个排序号的k个值的序列,遍历数组,当遍历的值小于序列的最后一个值的时候,就把这个数字插入进去,并且将最后的那个值弹出即可。具体代码如下:class Solution {public: vector<int> GetLeas...原创 2019-05-08 16:28:55 · 112 阅读 · 0 评论 -
牛客网_剑指offer_连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2019-05-08 16:40:53 · 404 阅读 · 0 评论 -
牛客网_剑指offer_整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解题思路对于每一个数字,采取除10取余的方法可以得到1的个数,具体见下列代码...原创 2019-05-08 17:07:04 · 98 阅读 · 0 评论 -
牛客网_剑指offer_二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路首先默认大家知道什么是二叉搜索树的后序遍历,大概就是遍历一个树的时候,先遍历左节点,然后遍历右节点,最后输出根节点,不明白的可以百度一下查一下相关的例子就能够理解了,应该是还比较好理解的。那么怎么判断一个序列是不是二叉搜索树的后序遍历序列...原创 2019-05-07 18:42:18 · 101 阅读 · 0 评论 -
牛客网_剑指offer_二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解题思路对于这道题目,采用深度优先搜索即可找到对应的路径,不过需要将对应的path和res设置为一个全局变量。具体代码如下:/*struct TreeNode { int va...原创 2019-05-07 20:12:23 · 89 阅读 · 0 评论 -
牛客网_剑指offer_重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路这是一道考察递归思想的编程题,首先,前序遍历的第一个元素一定是节点的值,然后对比中序遍历找到该节点的左子树和右子树,然后根据左子树和右子树对应...原创 2019-05-07 21:03:00 · 85 阅读 · 0 评论 -
牛客网_剑指offer_复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路1.从旧的链表中创建新链表,本来是A->B->C变成了A->A’->B->B’->C->C’2.根据旧的链表的rando...原创 2019-05-07 22:10:11 · 83 阅读 · 0 评论 -
牛客网_剑指offer_二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路找到该树的中序遍历的序列,就是一个排序好的序列了,然后将这个排序好的序列的左右节点相互连起来就好了。中点是要理解中序遍历这个概念,做好了中序遍历之后就十分简单了。具体代码如下:/*struct TreeNode { int val; struct Tre...原创 2019-05-07 22:34:36 · 142 阅读 · 0 评论 -
牛客网__剑指offer__序列化二叉树__python
具体思路用到了广度有限搜索的思想,然后对None节点特殊处理一下即可,具体的代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass So...原创 2019-07-31 13:53:09 · 178 阅读 · 0 评论 -
牛客网__剑指offer__二叉搜索树的第k个节点__python
利用深度优先搜索,利用二叉搜索树的性质,我们用中序遍历的结果就是排序好的一个节点的列表,取出第K个即可。具体代码如下:# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.righ...原创 2019-07-31 14:16:01 · 139 阅读 · 0 评论 -
牛客网__剑指offer__滑动窗口的最大值__python
解题思路比较简单,具体的就放到代码中了。# -*- coding:utf-8 -*-class Solution: def maxInWindows(self, num, size): #1.直接暴力求解 #2.利用大顶堆来解决问题 #1 res = [] if size == 0: ...原创 2019-08-04 12:35:39 · 107 阅读 · 0 评论 -
牛客网__剑指offer__矩阵中的路径__python
解题思路:利用递归的思想可以解决问题,总体来说,就是超左右前后四个方向的深度优先搜索的问题。具体代码如下:# -*- coding:utf-8 -*-class Solution: def hasPath(self, matrix, rows, cols, path): # write code here #1.左右前后方向中存在下一个字符,则可以考...原创 2019-08-05 10:55:30 · 158 阅读 · 0 评论 -
牛客网_剑指offer_包含min函数的栈_c++
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))解题思路维持两个数据,一个用来按顺序存放push进来的数据,一个用来存放存进来的数据排序后的结果,对应的就可以返回在O(1)的情况下返回min的结果了(返回排序后的第一个值就是最小值)。具体代码如下:class Solution {private: vector<...原创 2019-05-05 21:53:16 · 173 阅读 · 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.解题思路这道题目的思路还是比较简单的,设置四个方位,上下左右,分别为top,buttom,left,right,然后...原创 2019-05-05 21:27:38 · 106 阅读 · 0 评论 -
牛客网_剑指offer_旋转数组的最小数字_c++
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路:这道题目要利用之前是非减序的性质,直接从头开始遍历,找到第一个比首元素小的数字就是答案,因为它的后面是...原创 2019-04-23 11:17:32 · 97 阅读 · 0 评论 -
牛客网_剑指offer_斐波那契数列_c++
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39解题思路:1.利用递归的思想即可,设置好第一个和第二个数字,其余的等于前两个元素相加,一直递归到最终的结果即可。缺点:递归虽然写起来简洁,实际上计算效率特别底,可以通过递归树来进行理解。由于计算效率太低,最终测试不通过。class Solution {pu...原创 2019-04-23 11:30:25 · 184 阅读 · 0 评论 -
牛客网_剑指offer_跳台阶_c++
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解题思路:跳到n阶的时候,可能是n-2阶一次性跳两阶过来的,还可能是由n-1阶一次性跳一阶过来的,根据这个原理,所以说f(n) = f(n-1) + f(n-2)。利用递归思想可以解题,具体代码如下:class Solution {public: ...原创 2019-04-23 13:33:13 · 129 阅读 · 0 评论 -
牛客网_剑指offer_变态跳台阶_c++
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路:依旧还是递归的思路,找到对应的递归式十分重要,这里显然,可以由任意一阶到第n阶,则对应的递归式为:f(n) = f(0) + f(1) + f(2) + … + f(n-1)注意:由于可以从原始的位置直接跳到n阶,所以这里一定要注意有一个f(0) = 1具体...原创 2019-04-23 13:51:51 · 1195 阅读 · 0 评论 -
剑指offer_牛客网_替换空格
题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:1.看到这里的length是前面第一个参数,也就是那个字符数组的长度2.计算str的长度;3.计算str中的空格的数量,每多一个空格,新的字符串长度就要加2,计算得到新字符串长度4.如果新字符串长度大于length则直...原创 2019-04-18 17:20:09 · 111 阅读 · 0 评论 -
剑指offer_牛客网_从尾到头打印链表
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList解题思路:这个题目很简单,就直接用head = head->next来迭代即可,然后既然是从尾到头,就用vector的insert函数,在列表的最前面插入元素即可。/*** struct ListNode {* int val;* struct ListNode *next;* ...原创 2019-04-18 17:36:53 · 78 阅读 · 0 评论 -
牛客网_剑指offer_反转链表_c++
题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路设置两个ListNode的指针,first和second,在遍历的同时,使得second->next的值为first,然后注意处理下边界情况即可,具体代码如下:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x)...原创 2019-05-02 20:11:23 · 189 阅读 · 0 评论 -
牛客网_剑指offer_合并两个排序的链表_c++
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路有点类似于归并排序的里面的一个基本操作,设置一个新的节点res,两个指针,分别指向两个输入,比较两个对应的val的大小来决定谁放到res的next里面去,考虑好边界情况即可解题。具体代码如下:1.递归版本:/*struct ListNode { int val; struc...原创 2019-05-02 22:25:45 · 127 阅读 · 0 评论 -
牛客网_剑指offer_二叉树的镜像_c++
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树8/ \6 10/ \ / \5 7 9 11镜像二叉树8/ \10 6/ \ / \11 9 7 5解题思路:利用递归的思想,翻转左右子树即可,注意好边界情况,具体代码如下:/*struct TreeNode { int val; stru...原创 2019-05-03 12:20:23 · 113 阅读 · 0 评论 -
牛客网_剑指offer_矩形覆盖_c++
题目描述我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路:这道题目其实本质上就是斐波那契数列,具体分析如下:首先,对于n=1的时候,只有一种情况;其次,对于n=2的时候,一共有两种情况,两个都是竖着或者两个都是横着;最后分析递归式,由于到达n的方式有两种,要么是前一个是竖着的小矩形,要么是前面是两个横着...原创 2019-04-25 12:19:42 · 158 阅读 · 0 评论 -
牛客网_剑指offer_二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路由于是考虑二进制中1的个数,直接用一个无符号整形数字,从1开始左移,做一个遍历即可。具体代码如下:class Solution {public: int NumberOf1(int n) { //负数用补码表示 //负数补码:第一位表示符号,负数...原创 2019-04-25 12:48:11 · 470 阅读 · 0 评论 -
牛客网_剑指offer_数值的整数次方_c++
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路题目十分简单,只需要对应指数的三种情况分别求解即可,具体情况的解析放在注释当中了,简单易懂。具体代码如下:class Solution {public: double Power(double base, int exponent) { ...原创 2019-04-25 13:33:40 · 143 阅读 · 0 评论 -
牛客网_剑指offer_字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题思路如果字符串长度为len,则分len步去做,第n步的作用为找到所有的前n步的可能的情况,也就是说,假设len为4,则第一步...原创 2019-05-08 14:52:46 · 128 阅读 · 0 评论 -
牛客网_剑指offer_调整数组顺序使奇数位于偶数前面_c++
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路思路1:1.一个十分投机取巧的方式是,用一个新的vector按顺序放进去,然后对应的一一赋值即可,具体的时间复杂度为O(n),空间复杂度也是O(n),具体代码如下:class Solution {pub...原创 2019-05-05 22:39:13 · 117 阅读 · 0 评论 -
牛客网_剑指offer_链表中倒数第k个结点_c++
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路利用前后指针的方法,第一个指针first先往前推移k步,第二个指针second放在开头,两者之间相差k步,然后同时向前推移,当first指针到达末尾的时候,可以根据second找到倒数第k个指针。具体代码如下:/*struct ListNode { int val; struct ListNode *next; ListN...原创 2019-04-25 14:54:26 · 131 阅读 · 0 评论 -
牛客网__剑指offer__机器人的运动范围__python
解题思路:利用bfs的思想,不断的向外扩展邻接节点,如果某一步扩展不到新的邻接节点,则停止循环,最后得到所有节点的数量即可。具体代码如下:# -*- coding:utf-8 -*-class Solution: def movingCount(self, threshold, rows, cols): # write code here #bfs思...原创 2019-08-05 20:57:31 · 142 阅读 · 0 评论