刷题之剑指offer
文章平均质量分 52
sun10081
这个作者很懒,什么都没留下…
展开
-
剑指offer系列(27):字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路分析回溯法思想,两字第一次母相同则不进行交换,用hashset解决重复问题,collection里的sort方法进行排序。代码import java.util.*;public class Solution {...原创 2018-05-01 22:07:09 · 145 阅读 · 0 评论 -
剑指offer系列(38)二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路分析先复习一下概念树的深度:以二叉树的根结点所在的层数为1,根结点的孩子结点所在的层数为2,以此下去。深度是指所有结点中最深的结点所在的层数。递归思路:树的深度为左右子树深度的较大值+1,以此递归到底层,即可得出答案循环思路:借鉴之前打印二叉树的思路,层序遍历,设置一...原创 2018-06-18 19:24:18 · 150 阅读 · 0 评论 -
剑指offer系列(56)删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路分析循环写法:设置两指针,完成链表的遍历及节点删除,注释里写的很详细了 不多说递归写法:通过判断条件,设置参数为不重复的节点,如此递归,相当于跳过来所有重复的元素,此写...原创 2018-06-18 20:30:20 · 110 阅读 · 0 评论 -
剑指offer系列(52)正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。样例输入aaa a.a 输出 true输入aaa ab*ac*a 输出 true输入aaa aa.a 输出false输入aaa ab*a 输出false思路分析此题要分两种情况当模式中的第...原创 2018-06-20 01:29:53 · 167 阅读 · 0 评论 -
剑指offer系列(58)对称二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路分析此题同原 leetcode(101)Symmetric Tree递归方法 比较对应左子树与右子树值循环方法 层序遍历 比较代码方法一 递归boolean isSymmetrical(TreeNode pRoot){ return isSymmetrical...原创 2018-06-27 00:41:28 · 106 阅读 · 0 评论 -
剑指offer系列(23)二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。样例输入:{5.7.6.9.11.10.8}输出:true思路分析已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。 1、确定root; 2、遍历序列(除去root结点),找到第一个大于root的位置,...原创 2018-06-27 01:33:48 · 212 阅读 · 0 评论 -
剑指offer系列(17)树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路分析第一步:在树A中找到和树B的根节点的值一样的节点R第二步:判断树A中以R为根节点的子树是不是包含和树B一样的结构代码public boolean HasSubtree(TreeNode root1,TreeNode root2) { if (root1==null || roo...原创 2018-07-03 00:25:00 · 155 阅读 · 0 评论 -
剑指offer系列(24)二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路分析先序遍历,访问节点时,把该节点添加到路径上去,并累加该节点的值如果该节点为叶节点,并且路径中节点值的和刚好等于输入的整数,则符合当前路径要求当前节点访问完毕,要回到父节点访问其他节点,所以,在退出方法前要在路径上删除当前节点并减去当前节点值,以...原创 2018-07-03 00:47:46 · 119 阅读 · 0 评论 -
剑指offer系列(32) 把数组排成最小的数
题目描述‘输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路分析对数组中每两个元素进行组合,比较,确认出最小的排列。比如{3,32,321},3与32组合,332>323,所以交换3和32的位置, 3与321组...原创 2018-07-12 10:57:48 · 199 阅读 · 0 评论 -
剑指offer系列(6) 旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路分析采用二分法解答这个问题, mid = low + (high - low)/2 需要考虑三种情况...原创 2018-07-12 15:01:53 · 115 阅读 · 0 评论 -
剑指offer系列(28) 数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路分析方法一:排序,由于该数字在数组中所占超过一半,输出中位数即可,复杂度O(nlogn)方法二:利用hashmap,key记录数字值,value记录数字出现次数,遍历一遍数组即可...原创 2018-07-07 17:38:44 · 225 阅读 · 0 评论 -
剑指offer系列(2):替换空格
题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy 思路分析直接调用String类的replaceAll方法即可 代码public class Solution { public String replaceSpace(StringBuffer st...原创 2018-09-10 13:00:58 · 91 阅读 · 0 评论 -
剑指offer系列(16):反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。 样例输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL 思路分析双指针法,pre指针用于使原链表断链,指向反向,next指针用于节点的移动 代码及结果public ListNode ReverseL...原创 2018-09-23 17:25:23 · 97 阅读 · 0 评论 -
剑指offer系列(62):二叉搜索树的第k个结点
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点。 样例(5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 思路分析方法一:递归法 二叉搜索树按照中序遍历的顺序 打印出来 即为升序排序 设置一计数器 进行中序排序 找到第k个 即可方法二:非递归法 构造一个栈,思路同 中序遍历的非递归法 代码及结果方法一:in...原创 2018-09-24 16:04:16 · 2557 阅读 · 1 评论 -
剑指offer系列(4):重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 样例分析例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回{1,2,5,3,4,6,7} 思路分析前序遍历序列中,根节点总在最前。而中序遍历序列中,根节点分割了左右子树,所以,找...原创 2018-09-25 15:32:53 · 111 阅读 · 0 评论 -
剑指offer系列(7):斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 思路分析斐波那契数列f(n)= f(n-1) + f(n-2),由于要避免栈溢出,不能采用直接递归的方法。方法一:变递归为循环方法二:尾递归,思路同方法一方法三:扩大范围,f(n)= f(n-1) + f(n-2) = f(n-2) + f(n-3) + f(...原创 2018-09-25 16:15:04 · 133 阅读 · 0 评论 -
剑指offer系列(36):两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。 样例A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3输入A,B,输出c1 思路分析方法一:找到长链表,先行走数...原创 2018-09-25 17:01:41 · 120 阅读 · 0 评论 -
剑指offer系列(46)孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去.......原创 2018-06-10 17:30:14 · 110 阅读 · 0 评论 -
剑指offer系列(45)扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为1...原创 2018-06-10 15:24:43 · 153 阅读 · 0 评论 -
剑指offer系列(16):合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路分析简单的说,就是分别遍历list1,list2,比较每个节点值,然后进行合并,具体代码实现分为递归和非递归两种。递归无甚好说,看代码即可。非递归版本中,head为合并链表头结点,current为合并中的当前节点,其余在注释中有写。 代码递归版本/*publ...原创 2018-04-27 20:17:52 · 97 阅读 · 0 评论 -
剑指offer系列(41):和为s的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述输出所有和为S的连续正数序列。序列内按照...原创 2018-05-22 00:48:42 · 752 阅读 · 0 评论 -
剑指offer系列(49):把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0样例输入 +2147483647 1a33输出 2147483647 0思路分析题目描述过于简单了,对于边界条件,难道让做题者猜测吗(手动滑稽)1.省略字符开头空格...原创 2018-05-26 16:41:09 · 186 阅读 · 0 评论 -
剑指offer系列(14) 链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路分析定义两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指针正走(k-1)步,到达第k个结点。然后两个指针同时正向移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个结点。代码/*public class ListNode { int val; ListNode next = null; ...原创 2018-05-27 22:14:45 · 75 阅读 · 0 评论 -
剑指offer系列(42):和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。思路分析采取两边夹逼的方法,和前一题类似,两数和大于s,高字位自减,两数和小于s,低字位自增;另外吐槽一下,此题第一组数,即两数差最大的那组为正确答案,无需多余判断,看来出题人是没有仔细考虑过这个哈~代码publ...原创 2018-05-23 12:40:03 · 169 阅读 · 0 评论 -
剑指offer系列(30)连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至...原创 2018-06-11 22:56:32 · 82 阅读 · 0 评论 -
剑指offer系列(39)平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路分析方法一:平衡二叉树定义:二叉树中任意节点的左,右子树深度不超过1 参考之前二叉树的深度,利用递归,依次求出深度,比较即可得出答案方法二:方法一中,一个节点作为子节点时被遍历,作为根节点时同样被遍历,如此,有太多重复的遍历次数 如果用后序遍历的方式遍历二叉树的每个节点,那么在遍历到一个节点之...原创 2018-06-21 00:47:01 · 178 阅读 · 0 评论 -
剑指offer系列(65)矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占...原创 2018-06-15 00:28:34 · 162 阅读 · 0 评论 -
剑指offer系列(66)机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路分析和前题类似,这个方格也可以看做一个m*n...原创 2018-06-15 00:49:51 · 117 阅读 · 0 评论 -
剑指offer系列(18)二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。样例二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5思路分析1.获取当前节...原创 2018-06-22 23:33:58 · 131 阅读 · 0 评论 -
剑指offer系列(3)从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值思路分析看到题目,首先想到的是逆转链表,然后打印,但这样会改变链表结构,明显不符合仅仅“打印”的要求随后又想到,构造一种数据结构,使得链表数据插入后可以按反序输出,自然就想到了栈方法一:利用栈的先入后出原则,遍历整个链表后再逐个出栈方法二:利用递归,(递归本质是栈结构)方法三:利用ArrayList的add api,循环写法/** * I...原创 2018-06-16 01:43:34 · 121 阅读 · 0 评论 -
剑指offer系列(1):二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路分析由题意可知,把该数组看做一个矩阵,则左上角array[0][0]为最小元素,右下角array[n][n]为最大元素。由此,选取左下角作为起点,开始遍历,因为从左下往上是递减,往右是递增,可避免多余的遍历代码public...原创 2018-06-10 00:17:14 · 84 阅读 · 0 评论 -
剑指offer系列(44)翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路java api的运用,...原创 2018-06-10 00:51:48 · 117 阅读 · 0 评论 -
剑指offer系列(22)从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。样例思路分析构造一个队列容器,即可轻松解决这道题步骤操作队列1 打印节点8 节点6、节点102打印节点6 节点10、节点5、节点73打印节点10节点5、节点7、节点9、节点114打印节点5节点7、节点9、节点115打印节点7节点9、节点116打印节点9节...原创 2018-06-17 19:55:32 · 157 阅读 · 0 评论 -
剑指offer系列(60)把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路分析和剑指offer(22)思路基本一致,不过加入了两个变量,start记录已打印节点数,end记录当前层总节点数,以此来实现分层代码public class 把二叉树打印成多行 { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ...原创 2018-06-17 20:58:32 · 127 阅读 · 0 评论 -
剑指offer系列(59)按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路分析在剑指offer(60)题基础上,再加入一个判断层数奇偶的方法代码大同小异 不多赘述代码import java.util.ArrayList;import java.util.Collections;import java.util.L...原创 2018-06-17 22:22:18 · 129 阅读 · 0 评论 -
剑指offer系列(47):求1+2+3+...+n
题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 样例输入5输出15 思路分析方法一:利用Math类的api实现n(n+1),即Math.pow(n,2) + n方法二:利用递归,达到循环1+2+...+n的效果,异常处理来结束递归方法三:同样是递归,利用短...原创 2018-10-07 10:32:05 · 163 阅读 · 0 评论