剑指offer
wang13342322203
这个作者很懒,什么都没留下…
展开
-
57.和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数...原创 2019-08-12 15:41:36 · 82 阅读 · 0 评论 -
40.数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。Partiton思想 时间复杂度O(n)class Solution {public: int MoreThanHalfNum_Solution(vector...原创 2019-07-31 11:08:13 · 83 阅读 · 0 评论 -
47.礼物的最大值
#include<iostream>#include<vector>using namespace std;int maxOfGift(int*arry, int rows, int cols, int row, int col);int maxGift(int*arry, int rows, int cols);int maxOfGift(int*arry,...原创 2019-08-03 18:02:51 · 98 阅读 · 0 评论 -
把数字翻译为字符串
题目要求: 给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路:递归,遍历数字的位,当前位翻译一种方法,如果当前位和下一位能结合成另一种翻译,则有可记录为一种方法。但是递归会找出重复计算...转载 2019-08-03 15:34:27 · 166 阅读 · 0 评论 -
39.数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:思路一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。(比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等)这种方法虽然容...原创 2019-07-30 23:10:11 · 79 阅读 · 0 评论 -
45.把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:对vector容器内的数据进行排序,按照 将a和b转为string后 若 a+b<b+a a排在在前 的规则排序,如 2 21 因为 212 < 221 所以 排序后为 2...原创 2019-08-03 15:04:57 · 90 阅读 · 0 评论 -
32.按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。-----------------------------------------------------------------------------------------------------------------用一个队列...原创 2019-07-21 14:15:18 · 92 阅读 · 0 评论 -
32.把二叉树打印成多行
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。--------------------------------------------------------------------------------------------------------加一个辅助队列,和上道题思路差不多,主要是难在队列中要始终保持是当前层节点或者是下一层所有节点,这就需要一个变量记载当前...原创 2019-07-21 11:48:25 · 75 阅读 · 0 评论 -
32从上往下打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。-----------------------------------------------------------------------------------------借助队列,将root,root->left,root->right分别加入队列,然后依次打印节点内的值/*struct TreeNode {...原创 2019-07-21 10:34:47 · 65 阅读 · 0 评论 -
38字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解析:用递归的算法假如是a、b、cfor (int i = begin;i < str_lengt...转载 2019-07-29 21:03:46 · 118 阅读 · 0 评论 -
37.序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树解析:1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点不为空时,在转化val所得的字符之后添加一个' , '作为分割。对于空节点则以 '#' 代替。2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:在递归时,递归函数的参数一定要是char ** ,这样才能保证...原创 2019-07-29 17:43:51 · 74 阅读 · 0 评论 -
34二叉树中和为某一值的路径
题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)-------------------------------------------------------------------------------------------...原创 2019-07-23 16:57:07 · 55 阅读 · 0 评论 -
33.二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。---------------------------------------------------------------------------------------------------------------------BST...原创 2019-07-23 13:53:06 · 74 阅读 · 0 评论 -
41.数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。思路:一、为了保证插入新数据和取中位数的时间效率都高效,这里使用大顶堆+小顶堆的容器,并且满足...原创 2019-08-01 11:48:23 · 87 阅读 · 0 评论 -
57.和位S的数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。解答:双指针class Solution {public: vector<int> FindNumbersWithSum(vector<int> arra...原创 2019-08-12 15:40:20 · 103 阅读 · 0 评论 -
55.平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(!pRoot) return true; int C1 = TreeDepth(pRoot->left); int C2 = Tr...原创 2019-08-11 17:00:37 · 95 阅读 · 0 评论 -
二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。解析:二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。所以,按照中序遍历顺序找到第k个结点就是结果。class Solution {public: int count_Node = 1; TreeNode* ...原创 2019-08-10 18:56:41 · 76 阅读 · 0 评论 -
58.左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!class Solution {public: string LeftRotate...原创 2019-08-14 13:14:34 · 97 阅读 · 0 评论 -
翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?使用栈clas...原创 2019-08-14 11:55:10 · 84 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解答:找出2个链表的长度,然后让长的先走两个链表的长度差,然后再一起走(因为2个链表用公共的尾部)/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solu...原创 2019-08-09 17:54:42 · 138 阅读 · 0 评论 -
字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。class Solution{public: string s; map<...原创 2019-08-09 12:43:26 · 100 阅读 · 0 评论 -
43.整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。可以看看牛客讨论区的简便算法,没时间看了,就用最简单方法做的...原创 2019-08-02 11:28:47 · 100 阅读 · 0 评论 -
50.第一个只出现一次的字符
题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)解答:用hash表map<char,int>,把每个char放在数组中,int用来统计出现次数一开始做的时候插入数据用的是insert,insert有不好的地方,用insert函数插入数据,在数据的插入上...原创 2019-08-06 15:21:25 · 80 阅读 · 0 评论 -
36.二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解析:这道题一开始看答案都无法理解,后来终于弄懂了就是将二叉树的left和right转化为链表节点的左右指针,因为是按照从小到大顺序所以就得是中序遍历,得到每个节点,然后就是对节点进行指针运算这三句是关键,而且前两句顺序不能变//cur指向当前节点...转载 2019-07-28 17:59:14 · 90 阅读 · 0 评论 -
49.丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解析:通俗易懂的解释:首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以...原创 2019-08-05 23:48:27 · 105 阅读 · 0 评论 -
32.栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)-----------------------------------------...原创 2019-07-20 11:56:36 · 59 阅读 · 0 评论 -
30.包含main函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。--------------------------------------------------------------------------------------------思路:这个题看半天没看明白,最后理解了,就是最终实现栈的功能,然后返回栈中最小值,但是吧,...原创 2019-07-20 11:56:29 · 170 阅读 · 0 评论 -
28.对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。---------------------------------------------------------------------------------------------------------思路:首先根节点以及其左右子树,左子树的左子树和右子树的右子...原创 2019-07-20 11:56:20 · 61 阅读 · 0 评论 -
15.二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。--------------------------------------------------------------------------------这道题看剑指offer,有很好的解答...原创 2019-06-25 12:20:53 · 88 阅读 · 0 评论 -
矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字...原创 2019-06-01 20:32:22 · 81 阅读 · 0 评论 -
10.矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路当n=1时,记作F(1), 共有1种方法;当n=2时,记作F(2), 共有两种方法;当n=3时,记作F(3), 分为两种情况:第一次用一个矩形竖着覆盖(左图蓝色),则剩下共有F(n-1)种方法,即F(2) 种方法;第一次用一个矩形横...原创 2019-05-29 15:48:03 · 78 阅读 · 0 评论 -
9.变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。别人想法:链接:https://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387来源:牛客网(一)关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:f(1) ...原创 2019-05-29 12:13:51 · 80 阅读 · 0 评论 -
8.跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。别人想法:1、 这种问题一般是有规律的,跳1级台阶,只有1种方法;跳2级台阶,有2种方法;跳3级台阶,有3种方法;跳4级台阶,有5种方法,依次下去,跳一个n级的台阶的方法数是跳n-1级台阶的方法数与跳n-2阶台阶的方法数的总和。这种思路可以用逆推去想,要跳上一个...原创 2019-05-28 22:37:40 · 112 阅读 · 0 评论 -
7.斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39有两种算法递归:递归中有很多重复的地方,从而对性能带来很大的负担递归可能引起更大的问题:调用栈溢出动态规划:自下而上计算,时间复杂度大O(n)代码: int Fibonacci(int n) { ...转载 2019-05-28 21:35:25 · 129 阅读 · 0 评论 -
6.旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。自己想法:首先复习一下二分法{二分法的使用条件: 待查找的序列区间单调有序(单调递增...原创 2019-05-28 10:49:30 · 56 阅读 · 0 评论 -
4、二叉树的下一个节点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。别人思路:1.二叉树为空,则返回空;2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父...原创 2019-05-18 12:58:35 · 115 阅读 · 0 评论 -
3.重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:如果理解了递归的访问,那么建树的过程就容易多了,前序遍历序列的第一个数(后序遍历的最后一个数)一定是根结点,所以可以根据此...原创 2019-05-12 19:52:56 · 123 阅读 · 0 评论 -
5.用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分析:入队:将元素进栈A出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈;如果不为空,栈B直接出栈。错误分析:自己写代码时遇到了一个及其严重的错误,那就是容器有删除和添加元素时用了for循环,而且是size()函数循环,这是一...原创 2019-05-21 22:30:49 · 83 阅读 · 0 评论 -
2.替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。代码:链接:https://www.nowcoder.com/questionTerminal/4060ac7e3e404ad1a894ef3e17650423来源:牛客网//思路//1:从前往后插入,...原创 2019-05-06 21:32:22 · 75 阅读 · 0 评论 -
13.机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?--------------------...原创 2019-06-25 19:10:36 · 69 阅读 · 0 评论