剑指0ffer
文章平均质量分 51
努力小菜籽
这个作者很懒,什么都没留下…
展开
-
[剑指offer]把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。分析:层序遍历用队列,这道题比较讨厌的是要把每层分开,如果只是单纯把值全部打印出来,只要判断队列是否为空就可以了,这里需要判断已经打印的个数是不是这一层的总个数。代码:/*struct TreeNode { int val; struct TreeNode *left; str原创 2016-05-23 10:30:14 · 402 阅读 · 0 评论 -
[剑指offer]旋转数组的最小值
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。分析:这题有必要反思一下,首先拿到这道题就轻敌了,因为之前在leetcode做过,不就是二分嘛。照着这个思路写了一下,不是超时,就是一个重复几个2的用例通不过,回去翻原创 2016-04-22 19:41:46 · 364 阅读 · 0 评论 -
[剑指offer]二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析:1.二叉树为空,则返回空;2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继原创 2016-05-18 13:34:41 · 304 阅读 · 0 评论 -
[剑指offer]删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5分析:新建一个头节点,把不重复的节点加在尾指针后面。代码:/*struct ListNode { int val; struct ListNode *next; Li原创 2016-05-18 13:14:34 · 229 阅读 · 0 评论 -
[剑指offer]数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。分析:排序数组找数字,当然想到用二分,用两次二分,分别找到第一个k和最后一个k,计算两者位置的差值返回。要注意数组中不包含这个数字的情况。代码:class Solution {public: int GetFirstk(vector data,int k,int low,int high){ whil原创 2016-05-07 09:00:46 · 226 阅读 · 0 评论 -
[剑指offer]链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点。分析:快慢指针法,要注意测试用例中包含没有环的情况。代码:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class原创 2016-05-17 16:44:22 · 425 阅读 · 0 评论 -
[剑指offer]两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。分析:计算两个链表的长度,同时比较一下链表尾元素是否相同,如果不同那么两个链表就不相交。让比较长的链表的指针先走两个链表长度的差值,然后两个指针再一起走,知道两个指针指向相同元素,这个元素就是第一个公共节点。代码:/*struct ListNode { int val; struct ListNode *原创 2016-05-06 15:20:34 · 200 阅读 · 0 评论 -
[剑指offer]数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。分析:类似于mergesort的思想,对于两个排序的数组,用两个指针分别指向末尾,比如p,q,如果p的值大于q,那么p与q和q之前所有数字都可以组成逆序对,count就加上后一个数组的长度,再将p指针前移继续比较;如果q的值比较大,那么直接将q前移原创 2016-05-06 13:50:51 · 287 阅读 · 0 评论 -
[剑指offer]用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分析:其实画个图就很好理解了,压栈时直接压入stack1,弹栈的话就把stack1中d元素全部压入stack2,再把stack2的栈顶元素弹出,这个就是队列的队首元素了,再把剩下d压回stack1.代码:class Solution{public: void push原创 2016-04-21 22:46:45 · 244 阅读 · 0 评论 -
[剑指offer]字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。分析:用map记录字符出现的次数。代码:class Solution{pu原创 2016-05-17 12:53:00 · 355 阅读 · 0 评论 -
[剑指offer]正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配分析:正则表达式真是太恶心了。。。一开始想遍历一遍硬匹配,发现情况实在太多了转载 2016-05-16 21:19:46 · 519 阅读 · 0 评论 -
[剑指offer]重建二叉树
分析:C++:/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */c原创 2016-04-21 09:33:10 · 824 阅读 · 0 评论 -
[剑指offer]第一个只出现一次的字符位置
题目描述在一个字符串(1分析:就是建立一个哈希表,把每个字符出现的次数求出来,第二次遍历找到第一个出现次数为1的字符。代码:class Solution {public: int FirstNotRepeatingChar(string str) { int n=str.size(); if(n==0) return -1;原创 2016-05-05 09:15:45 · 366 阅读 · 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]。不能使用除法。分析:第一遍从头开始遍历,用temp做累乘,保存i之前的数字的乘积,赋值给B[i],这样B[i]还差i之后的数字的乘积,那么再从末尾向前再遍历一遍,思路一样。代码:原创 2016-05-16 10:35:33 · 328 阅读 · 0 评论 -
[剑指offer]斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。分析:用递归会栈溢出,所以用迭代。代码:class Solution {public: int Fibonacci(int n) { int a=1; int b=1; if(n==1) return a; if(n==2)原创 2016-04-22 21:39:41 · 294 阅读 · 0 评论 -
[剑指offer]二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分析:递归实现代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), le原创 2016-05-08 08:42:58 · 193 阅读 · 0 评论 -
[剑指offer]序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树分析:基本思想是先序遍历二叉树,再从先序遍历的结果反序列化二叉树代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : v原创 2016-06-04 09:14:57 · 306 阅读 · 0 评论 -
[剑指offer]机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?分析:依然是回溯法代码:原创 2016-06-03 08:52:27 · 448 阅读 · 0 评论 -
[剑指offer]矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符原创 2016-06-02 12:57:37 · 359 阅读 · 0 评论 -
[剑指offer]对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析:递归,如果左子树的右子树和右子树的左子树相同且左子树的左子树与右子树的右子树相同,那么这就是一棵对称二叉树。代码:/*struct TreeNode { int val; struct TreeNode *left; st原创 2016-05-20 10:42:19 · 463 阅读 · 2 评论 -
[剑指offer]链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。分析:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToTail(L原创 2016-04-25 08:36:10 · 184 阅读 · 0 评论 -
[剑指offer]调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。分析:我发现我真是题目挖什么坑我就怎么跳啊。。一看到这个题目心想,不就是快排么,写完了用例没通过,原来是题目要求调整后相对位置不变,而快排是不稳定的。其实应该用冒泡排序的思想,遇到序列是前偶后奇就原创 2016-04-24 21:27:21 · 267 阅读 · 0 评论 -
[剑指offer]数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析:之前做过一个数出现一次的题,全部异或完了就是最后的结果,但是本题是两个数都只出现了一次。。表示看了答案。。真是巧妙。。(1)第一次使用异或运算,得到了两个只出现一次的数相异或的结果。(2)因为两个只出现一次的数肯定不同,即他们的异或结果一定不为0,一定有转载 2016-05-09 08:57:31 · 241 阅读 · 0 评论 -
[剑指offer]平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。分析:平衡二叉树是一颗空树或者左右子树的高度差不超过1。感觉我用的方法很蠢。。就是按照定义的左右子树的高度差求出来再判断。。代码:class Solution {public: int getDepth(TreeNode* pRoot){ if(pRoot==nullptr) return原创 2016-05-09 08:34:40 · 218 阅读 · 0 评论 -
[剑指offer]数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。分析:这个分析过程是转的,我没有想到。 * 1.全面考察指数的正负、底数是否为零等情况。 * 2.写出指数的二进制表达,例如13表达为二进制1101。 * 3.举例:10^1101 = 10^0001*10^0100*10原创 2016-04-24 20:04:43 · 281 阅读 · 0 评论 -
[剑指offer]二进制中1的个数
分析:先来看一个错误答案(没错,就是我):class Solution {public: int NumberOf1(int n) { int ret=0; while(n){ ret+=n&1; n=n>>1; } return ret; }}原创 2016-04-24 17:05:58 · 262 阅读 · 0 评论 -
[剑指offer]矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?分析:又是斐波拉契数列。class Solution {public: int rectCover(int number) { int a=1; int b=1; if(number==0) r原创 2016-04-24 16:49:24 · 329 阅读 · 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],转载 2016-06-01 09:48:04 · 369 阅读 · 0 评论 -
[剑指offer]跳台阶&变态跳台
1、跳台阶题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:最后一次可以跳1级或者2级,f(n)=f(n-1)+f(n-2)代码:class Solution {public: int jumpFloor(int number) { int a=1; int b=原创 2016-04-23 14:50:21 · 578 阅读 · 2 评论 -
[剑指offer]把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。分析:这个是很基础的题目了,可惜上次在笔试中也还是忘记考虑了负数。。代码:class Solution {public: int StrToInt(string str) { int n=str.size(); if(n==0) return 0;原创 2016-05-15 18:09:45 · 261 阅读 · 0 评论 -
[剑指offer]数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。分析:虽然也AC了,但是没仔细看题,可以利用题目已有条件做到更简单的。我的想法是用一个容器保存已经出现的数原创 2016-05-15 18:06:46 · 325 阅读 · 0 评论 -
[剑指offer]按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。分析:其实和昨天做的层序遍历一样,只是加了判断在奇数层需要做一次反转。代码:/*struct TreeNode { int val; struct TreeNode *left; struct原创 2016-05-24 10:55:40 · 322 阅读 · 0 评论 -
[剑指offer]复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。分析:这个其实我记住了书里的方法。。因为真的很巧妙。第一遍遍历链表,在每一个节点后面先插入一个一模一样的节点(先不管random指针),此时链表就变成了a->a'->b->b'->c->c'->d->d',第二次遍历,如果节点有random指针,则将新复制的节点也设原创 2016-04-28 21:50:19 · 327 阅读 · 0 评论 -
[剑指offer]二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。分析;其实这道题之前写过,然而还是写了很久。。其实就是深搜,到达叶结点且和满足时就把path压入ret中,注意在递归调用返回之后要把path里最后一个元素pop_back掉。代码:/*struct TreeNode {原创 2016-04-28 15:10:36 · 242 阅读 · 0 评论 -
[剑指offer]和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述:输出所有和为S的连续原创 2016-05-10 13:33:15 · 295 阅读 · 0 评论 -
[剑指offer]和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例,输出两个数,小的先输出。分析: two sum问题代码:class Solution {public: vector FindNumbersWithSum(vector array,i原创 2016-05-10 11:07:35 · 256 阅读 · 0 评论 -
[剑指offer]二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析:后序遍历,最后一个元素为根元素,从倒数第二个元素向前搜索,找到第一个比根小的元素,这里就是分开左右子树的地方,这时候如果再向前搜索,能发现比根还要大的元素,说明就不是BST。递归判断两棵子树。注意判断返回true的条件是low>原创 2016-04-28 09:08:30 · 297 阅读 · 0 评论 -
[剑指offer]从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。分析:层序遍历用队列。代码:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};原创 2016-04-27 21:37:28 · 294 阅读 · 0 评论 -
[剑指offer]栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。分析:用一个辅助栈模拟压入弹出操作,当栈顶不等于弹出序列中指向的值时,就一直压入,直到遇到相等,返回fals原创 2016-04-27 21:25:06 · 256 阅读 · 0 评论 -
[剑指offer]包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。分析:设置一个保存当前最小元素的栈。class Solution {public: void push(int value) { s.push(value); if(mins.empty()||mins.top()>value){原创 2016-04-26 22:06:50 · 276 阅读 · 0 评论