剑指offer
ly_main
这个作者很懒,什么都没留下…
展开
-
剑指offer系列之16:树的子结构
题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。思路:要查找A中是不是含有和B一样的子树,可以分成两步,第一部在A中找到和B的根节点的值一样的节点R,第二步在判断以R为根节点的子树是不是包含和B一样的结构。第一部在二叉树中查找与根节点的值一样的节点,实际上就是树的遍历,可以用递归的方法来遍历,public boolean HasSubtree(TreeNode root1,TreeNode原创 2016-04-11 20:08:29 · 250 阅读 · 0 评论 -
剑指offer系列之2:字符串空格的替换
题目描述:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:我们可以先遍历一遍字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换后的字符串的总长度。重新生成一个替换后字符串长度的char数组,分别从旧字符串和新字符串的尾部开始循环,依次往前比较,只要遇到了空格就替换为%20。如果原创 2016-04-10 15:07:56 · 303 阅读 · 0 评论 -
剑指offer系列之55:删除链表汇总重复的节点
问题描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:这个链表是排序的,需要找到重复的节点,所以对链表进行遍历,而且在遍历的过程中需要对每个当前遍历的节点以及后面的节点进行比较直到遇到下一个节点不与当前节点重复。如果下一个节点与当前遍历的节点不重复,则继续遍历,直到把原创 2016-04-13 13:56:02 · 353 阅读 · 0 评论 -
剑指offer系列之54:链表中环的入口节点
题目描述:一个链表中包含环,请找出该链表的环的入口结点。 思路:此题的思路其实 很简单,之所以出现环,是因为在整个链表中出现了重复的节点,而遇到的第一个重复的节点就是环的入口节点。所以可以使用Set来保存遍历到的节点,因为Set集合是不允许出现重复元素的,所以当一个节点被第二次添加的时候,往Set中放元素是失败的。所以可以利用这一点找出第一个重复的元素。import java.util.HashS原创 2016-04-13 13:50:41 · 285 阅读 · 0 评论 -
剑指offer系列之56:二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况:1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则转载 2016-04-13 13:45:12 · 332 阅读 · 0 评论 -
剑指offer系列之59:把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:此题实际上与上面一题按之字形顺序打印相似,知识不需要判断打印的顺序是从左往右还是从右往左,这题的解法主要是要统计每一层的节点数。import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; Tre原创 2016-04-13 13:39:33 · 453 阅读 · 0 评论 -
剑指offer系列之58:按之字形顺序打印二叉树
题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:此题明显是层序遍历的思路。由于需要按照之字形打印每一层,相当于在打印每一行之前需要判断上一行打印的顺序。比如,如果上一行打印的顺序使从左到右,那么下一行的打印顺序应该是从右到左。实现的这点可以采用奇数行从左到右打印,偶数行从右到左进行打印。还原创 2016-04-13 09:45:17 · 423 阅读 · 0 评论 -
剑指offer系列之57:对称二叉树的判断
问题描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:前面有一题是打印输出某二叉树的镜像,回想其实现的思路是:采用层序遍历的思路对每一个遍历的节点,如果其有孩子节点,那么就交换两者。直到遍历的节点没有孩子节点为止,然而此题是对二叉树木镜像的判断,明显是更简单的,只需要进行两个判断:对节点的左孩子与其兄弟节点右孩子的判断以及对节点原创 2016-04-13 09:25:21 · 248 阅读 · 0 评论 -
剑指offer系列之53:字符流中第一个不重复的字符
题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:这题与前面的第一个不重复的字符有些重复了,请参照剑指offer系列之33import java.util.A原创 2016-04-13 09:08:59 · 220 阅读 · 0 评论 -
剑指offer系列之49:数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。思路:此题的思路还是比较简单的,与之前找出只出现一次的数字的题目有些类似,基本思路还是创建一个Map容器,key是出现的数字,原创 2016-04-12 21:40:17 · 252 阅读 · 0 评论 -
剑指offer系列之48:把字符串转换成整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。(考虑问题的全面性)思路:这个问题本身不是很难,但是要注意考虑问题的全面性。包括字符串是否有效的判断、是否是负数以及字符串表示的整数是否越界等问题。对于字符串有效性的判断主要是null以及空串的判定;负数之所以需要判断是因为在计算的时候是有用的;而是否越界的问题也是需要考虑的。因为一个越界的数是不可能计算出来的,那么这时候可以原创 2016-04-12 21:37:56 · 668 阅读 · 0 评论 -
剑指offer系列之47:不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号(发散思维能力)思路:既然不能使用加减乘除,那么只剩下位运算和逻辑运算了。采用位运算的思路分为三步走:第一步,不进位对两个做异或运算(因为不考虑进位,1与1,0与0的异或运算的结果刚好是两者相加的结果);第二步,通过与运算得到两个数的进位值,因为只有1与1进行与运算的时候才会产生进位,所以产生的进位可以看成是两者先原创 2016-04-12 21:34:47 · 232 阅读 · 0 评论 -
剑指offer系列之46:求1~n的整数的和
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:这种题目主要考查发散思维的能力。提供一种方法,java使用面向对象的方法,利用构造函数求解。public class Solution { public int Sum_Solution(int n) { if(n <= 0)原创 2016-04-12 21:31:12 · 343 阅读 · 0 评论 -
剑指offer系列之5:用两个栈来实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:具体实现上是一个栈作为压入栈,在压入数据时只往这个栈中压入,即为stackPush,另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出记为stackPop。因为数据压入栈的时候,顺序是先进后出的。那么只要把stackPush中的数据再次压入到stackPop中,顺序就变回来了。操作中一定要注意:如果s原创 2016-04-10 15:55:24 · 189 阅读 · 0 评论 -
剑指offer系列之1:二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路:根据题目条件,数组中的行和列都按照递增的顺序排序,所以使得这道题可以使用对角线的方法完成,可以从右上角的元素考虑,如果目标查找元素小于右上角的元素,那么不可能在右上角元素所在的列,如果目标大于剩余列的右上角的元素,那么原创 2016-04-10 14:58:54 · 327 阅读 · 0 评论 -
剑指offer系列之15:合并两个有序的链表
题目描述:输入两个递增排序的链表,合并两个链表使合并后的链表满足单调不减。思路1:递归的方法,因为两个链表都是排序的,所以可以先比较两个链表的头结点,这样就确定了合并之后链表的第一个节点,之后再比较两个链表的第二个节点(原来较大值与较小值所属链表的第二个节点进行比较),这样依次就能确定合并链表的第二个、第三个节点,故明显是一个递归的过程/*public class ListNode { i原创 2016-04-11 19:53:38 · 820 阅读 · 0 评论 -
剑指offer系列之14:反转链表
题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出翻转后链表的头节点。思路:在调整节点i的m_pNext指针时,除了需要知道节点i本身,还需要节点i的前一个节点h,因为需要把节点i的m_pNext指向节点h,同时还需要一个保存i的一个节点j,以防止链表断开,因此需要定义三个指针,分别指向当前遍历到的节点,它的前一个节点和后一个节点。/*public class ListNode {原创 2016-04-11 19:36:07 · 224 阅读 · 0 评论 -
剑指offer系列之13:链表中倒数第k个节点
题目描述:输入一个链表,输出该链表中倒数第k个节点,为了符合习惯,本题从1开始计数,即链表的最后一个节点是倒数第一个节点。思路:假设整个链表有n个节点,那么倒数第k个节点就是从头节点开始的第n-k+1个节点,为了实现只遍历链表一次就能得到倒数第k个节点,可以定义两个指针,第一个指针从链表的头节点开始向前走k-1,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头节点开始遍历,由于两个指针的原创 2016-04-11 17:27:03 · 248 阅读 · 0 评论 -
剑指offer系列之12:调整数组的顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分。思路:可以采用双指针的方法,让第一个指针指向偶数,第二个指针指向奇数,并且第一个指针在第二个指针的前面,就交换两个元素。这样,当第一个指针在第二个指针的后面的时候,就说明所有的奇数都移动到所有偶数的前面了。这时候的循环就可以结束了。 public static原创 2016-04-11 17:07:01 · 167 阅读 · 0 评论 -
剑指offer系列之11:打印1到最大的n位数
题目描述:输入数字n,按顺序打印出从1到最大的n为十进制数,比如输入3,则从1一直打印输出到999.思路1:该题最大的陷阱是没有规定n的范围,所以我么需要考虑大数问题,可以咋字符串上模拟数字的加法。函数increment使数字每次加1然后输出,函数output输出数字将高位的0舍掉。package dsproblem;import java.util.ArrayList;import java.u原创 2016-04-11 16:40:19 · 206 阅读 · 0 评论 -
剑指offer系列之10:数值的整次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路:这道题目本身并不难,但我们需要考虑代码的完整性,在面试过程中体现出来。幂的情况无非是三种:正数、0和负数。当幂是0的时候,直接返回1;当幂是负数的时候,需要先把其转化为正数来处理,然后返回其倒数就可以了;当幂是正数的时候,按照正常的计算方法就可以。同时还要注意三种错误的处理方原创 2016-04-11 15:57:00 · 230 阅读 · 0 评论 -
剑指offer系列之9:二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路1:可以首先把n和1做与运算,判断n的最低位是不是1,接着把1左移1位得到2,再和n做与运算,判断n的次低位是不是1,……这样反复左移每次都能判断n的其中一位是不是1。这种解法的循环的次数等于二进制的位数,32位的整数需要循环32次。 思路2:把一个整数减去1,再和原整数做与运算,会把该整数最右边的1编程0,那么一个整数原创 2016-04-11 15:04:09 · 235 阅读 · 0 评论 -
剑指offer系列之8:跳台阶问题
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:这种问题的思路一般是采用数学归纳法,当n=1时,只有一种跳法;当n=2时,青蛙可以一次跳2级,也可以一次跳两级,需要跳两次,所以有两种跳法;当n=3的时候,首先考虑一次跳1级的情况,由于有3级,所以还有2级没跳,而跳两级的跳法已经在前面n=2的情况中计算得到了;下面考虑一次跳2级的情况,同样跳完转载 2016-04-10 16:58:38 · 238 阅读 · 0 评论 -
剑指offer系列之7:斐波那契数列
题目描述:现在要求输入一个整数n,请你输出斐波那契数列的第n项。思路1:使用递归的方式:public static int fibonacci(int n) { if (n == 1 || n == 2) { return 1; } else { return fibonacci(n - 1) + fibonacci(n原创 2016-04-10 16:51:47 · 233 阅读 · 0 评论 -
剑指offe系列之6:旋转数组的最小值
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:旋转之后的数组实际上划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。而且最小的元素刚好是这两个子数组的分界线,在排序数组中可以采用二分查找的方法来实现原创 2016-04-10 16:41:51 · 278 阅读 · 0 评论 -
剑指offer系列之4:重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:做该题之前,需要明白二叉树的前序遍历、中序遍历和后序遍历的联系,前序遍历中,第一个数值是二叉树的根节点的值,在中序遍历中,二叉树的根节点位于序列的中间原创 2016-04-10 15:27:48 · 300 阅读 · 0 评论 -
剑指offer系列之3:从尾到头打印链表
题目描述:输入一个链表,从尾到头打印链表每个节点的值。 思路1:遍历的顺序是从头到尾,而输出的顺序是从尾到头,第一个遍历到的节点最后一个输出,最后一个遍历到的节点第一个输出,这是典型的”后进先出”,可以使用栈来实现,每经过一个节点时,把该节点放到一个栈中,当遍历完整个链表时,再从栈顶逐个输出节点的值。import java.util.ArrayList;import java.util.Stack原创 2016-04-10 15:16:27 · 419 阅读 · 0 评论 -
剑指offer系列之45:圆圈中最后剩下的数字
题目描述:用0,1,…,n-1,这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。(抽象建模能力)思路1:经典的解法,用环形链表模拟圆圈,可以创建一个总共有n个节点的环形链表,然后每次在这个链表中删除第m个节点。思路2:把这n个整数做成一个环,当数到哪个数的时候就把那个数移除,并从下一个数重新开始数。所已基本思路是:使用数组模拟环,当当前的元素的值原创 2016-04-12 21:25:05 · 276 阅读 · 0 评论 -
剑指offer系列之44:扑克牌顺子
题目描述:从扑克牌中随机抽取五张牌,判断这五张牌是不是顺子,2~10为数字本身,A为1,J为11,Q为12,K为13,而大王小王可以看成任何数字。(抽象建模能力)思路:需要把扑克牌的背景抽象成计算机语言,可以把五张牌看成五个数字组成的数组,大王小王为特殊的数字可以定义为0。对于五张牌是否是连续的,可以先把五个数进行排序,0可以代替任何数字,所以需要统计排序后的空缺,判断0是否能够填满空缺。所以第一步原创 2016-04-12 21:18:25 · 329 阅读 · 0 评论 -
剑指offer系列之29:连续子数组的最大和
题目描述:输入一个整型数组,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n)。思路:举例分析数组的规律,这实际上是一个逐步比较的过程,假设累加进行到某一步,继续累加下一个数的时候发现和变小了,就应该重新计算当前累加的和,这实际上就是一个重新赋值的过程。如果累加之后发现变大了,这当然是我们想要的,自然就继续累加了。累加之后再判断是否大于原来的最大值,如果不是的原创 2016-04-12 16:03:37 · 233 阅读 · 0 评论 -
剑指offer系列之28:最小的k个数
题目描述:输入n个数,找出其中最小的k个数。思路1:最简单的思路就是把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。其实可以使用java的api来完成排序。import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int []原创 2016-04-12 15:11:17 · 402 阅读 · 0 评论 -
剑指offer系列之27:数组中出现次数超过一半的数字
问题描述:数组中有一个数字出现的次数超过数组长度的一半,编写程序找出这个数字。原创 2016-04-12 14:58:39 · 206 阅读 · 0 评论 -
剑指offer系列之26:字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:先不考虑是否出现重读字符,要对一个字符进行全排列,可以把第一个字符和后面的字符看成两部分,而第一个字符原创 2016-04-12 14:43:28 · 315 阅读 · 0 评论 -
剑指offer系列之25:二叉搜索树与双向链表
题目描述:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树种节点指针的指向。思路:由于二叉搜索树的中序遍历就是排序的,如果是构造单链表,只需要一次中序遍历就可以了,但现在需要构造双链表,也就是在中序遍历的过程中需要设置每个节点的left与right指针,现在问题是如何设置这两个指针?二叉搜索树有一个特点,就是根节点的左子树上所有节点都比根节点的值小,而转载 2016-04-12 14:26:31 · 291 阅读 · 0 评论 -
剑指offer系列之24:复杂链表的复制
题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。思路:第一步,复制原来链表的节点,并设置next指针,这一步不同于简单的复制节点,而是把每个复制的节点都链在原节点的后面,相当于复制节点之间隔了一个原节点;第二步,设置复制节点的特殊指针,由于在第一步左了特殊处理,所以当一个节点R的特殊指针指向节点N的时候,复制节点R’的特殊指针则是N原创 2016-04-12 14:14:45 · 333 阅读 · 0 评论 -
剑指offer系列之23:二叉树中和为某一值得路径
问题描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:由于路径是从树的根节点开始到叶节点结束,因此需要首先遍历根节点,树的前序遍历符合这个要求,当用前序遍历访问到某一节点时,把该节点添加到路径上,并累加该节点的值,如果该节点为叶结点并且路径中节点值得和等于目标值,则当前的路径符合要求,如果当前节点不原创 2016-04-12 12:53:45 · 350 阅读 · 0 评论 -
剑指offer系列之22:二叉搜索树的后序遍历
题目描述:输入一个整数数组,判断该整数数组是不是某二叉搜索树的后序遍历结果。思路:二叉搜索树(Binary Search Tree)的定义:它或者是一颗空树,或者是:若它的左子树不为空,则左子树上的所有节点的值小于根节点的值,若右子树不为空,则右子树上的所有节点的值大于根节点的值,左右子树也分别是二叉搜索树。 在后续遍历得到的序列中,最后一个数字是二叉树根节点的值,数组中的数字可以分为两原创 2016-04-12 09:28:57 · 347 阅读 · 0 评论 -
剑指offer系列之21:从上往下打印二叉树
题目描述:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。思路:这是属于二叉树的按层遍历,该题可以用到数据结构队列,每一次打印到一个节点的时候,如果该节点有子节点,则把该节点的子节点按照左右顺序放到队列的末尾,接下来到队列的头部取出最早进入队列的节点,重复打印操作,知道队列中的所有节点都被打印出来为止。import java.util.ArrayList;import java原创 2016-04-12 09:18:26 · 228 阅读 · 0 评论 -
剑指offer系列之20:栈的压入弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路:建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二序列的顺序依次从该栈中弹出数字。可以通过举例得到规律原创 2016-04-12 09:12:00 · 232 阅读 · 0 评论 -
剑指offer系列之19:包含min函数的栈
问题描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求调用min函数的时间复杂度为O(1),可以把每次的最小元素放到一个辅助栈中,能够保证辅助栈的栈顶一直都是最小元素当最小数据元素从数据站中弹出,同时弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。这样能够保证,取了最小元素后,下一次取的时次小的元素(仍然是最小的)。import java.util.Sta原创 2016-04-12 09:00:57 · 261 阅读 · 0 评论