自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 剑指offer系列之55:删除链表汇总重复的节点

问题描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路:这个链表是排序的,需要找到重复的节点,所以对链表进行遍历,而且在遍历的过程中需要对每个当前遍历的节点以及后面的节点进行比较直到遇到下一个节点不与当前节点重复。如果下一个节点与当前遍历的节点不重复,则继续遍历,直到把

2016-04-13 13:56:02 352

原创 剑指offer系列之54:链表中环的入口节点

题目描述:一个链表中包含环,请找出该链表的环的入口结点。 思路:此题的思路其实 很简单,之所以出现环,是因为在整个链表中出现了重复的节点,而遇到的第一个重复的节点就是环的入口节点。所以可以使用Set来保存遍历到的节点,因为Set集合是不允许出现重复元素的,所以当一个节点被第二次添加的时候,往Set中放元素是失败的。所以可以利用这一点找出第一个重复的元素。import java.util.HashS

2016-04-13 13:50:41 284

转载 剑指offer系列之56:二叉树的下一个节点

题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况:1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则

2016-04-13 13:45:12 331

原创 剑指offer系列之59:把二叉树打印成多行

题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:此题实际上与上面一题按之字形顺序打印相似,知识不需要判断打印的顺序是从左往右还是从右往左,这题的解法主要是要统计每一层的节点数。import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; Tre

2016-04-13 13:39:33 453

原创 剑指offer系列之58:按之字形顺序打印二叉树

题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:此题明显是层序遍历的思路。由于需要按照之字形打印每一层,相当于在打印每一行之前需要判断上一行打印的顺序。比如,如果上一行打印的顺序使从左到右,那么下一行的打印顺序应该是从右到左。实现的这点可以采用奇数行从左到右打印,偶数行从右到左进行打印。还

2016-04-13 09:45:17 423

原创 剑指offer系列之57:对称二叉树的判断

问题描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路:前面有一题是打印输出某二叉树的镜像,回想其实现的思路是:采用层序遍历的思路对每一个遍历的节点,如果其有孩子节点,那么就交换两者。直到遍历的节点没有孩子节点为止,然而此题是对二叉树木镜像的判断,明显是更简单的,只需要进行两个判断:对节点的左孩子与其兄弟节点右孩子的判断以及对节点

2016-04-13 09:25:21 248

原创 剑指offer系列之53:字符流中第一个不重复的字符

题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:这题与前面的第一个不重复的字符有些重复了,请参照剑指offer系列之33import java.util.A

2016-04-13 09:08:59 220

原创 剑指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

原创 剑指offer系列之48:把字符串转换成整数

题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。(考虑问题的全面性)思路:这个问题本身不是很难,但是要注意考虑问题的全面性。包括字符串是否有效的判断、是否是负数以及字符串表示的整数是否越界等问题。对于字符串有效性的判断主要是null以及空串的判定;负数之所以需要判断是因为在计算的时候是有用的;而是否越界的问题也是需要考虑的。因为一个越界的数是不可能计算出来的,那么这时候可以

2016-04-12 21:37:56 667

原创 剑指offer系列之47:不用加减乘除做加法

题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号(发散思维能力)思路:既然不能使用加减乘除,那么只剩下位运算和逻辑运算了。采用位运算的思路分为三步走:第一步,不进位对两个做异或运算(因为不考虑进位,1与1,0与0的异或运算的结果刚好是两者相加的结果);第二步,通过与运算得到两个数的进位值,因为只有1与1进行与运算的时候才会产生进位,所以产生的进位可以看成是两者先

2016-04-12 21:34:47 232

原创 剑指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

原创 剑指offer系列之45:圆圈中最后剩下的数字

题目描述:用0,1,…,n-1,这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。(抽象建模能力)思路1:经典的解法,用环形链表模拟圆圈,可以创建一个总共有n个节点的环形链表,然后每次在这个链表中删除第m个节点。思路2:把这n个整数做成一个环,当数到哪个数的时候就把那个数移除,并从下一个数重新开始数。所已基本思路是:使用数组模拟环,当当前的元素的值

2016-04-12 21:25:05 276

原创 剑指offer系列之44:扑克牌顺子

题目描述:从扑克牌中随机抽取五张牌,判断这五张牌是不是顺子,2~10为数字本身,A为1,J为11,Q为12,K为13,而大王小王可以看成任何数字。(抽象建模能力)思路:需要把扑克牌的背景抽象成计算机语言,可以把五张牌看成五个数字组成的数组,大王小王为特殊的数字可以定义为0。对于五张牌是否是连续的,可以先把五个数进行排序,0可以代替任何数字,所以需要统计排序后的空缺,判断0是否能够填满空缺。所以第一步

2016-04-12 21:18:25 327

原创 剑指offer系列之43:左旋转字符串

题目描述:字符串的左旋转操作是吧字符串前面的若干个字符转移到字符串的尾部。要求输入字符串和要左旋转的位数,输出旋转后的字符串。(知识迁移能力,字符串的处理能力)思路:比如输入字符串“abcdefg”和2,要求把字符串前面两位移到后面变为“cdefgab”,这时可以把前面两个字符ab看成一部分,cdefg看成一部分,分别旋转这两部分,得到“bagfedc”,然后再旋转整个字符串即可。public cl

2016-04-12 21:10:40 278

原创 剑指offer系列之42:翻转单词序列

问题描述:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。思路:对于这种问题,可以通过两次反转字符串来实现,第一部翻转句子中所有的字符,第二步翻转每个单词中字符的顺序。关键是如何实现翻转单词的函数。public class Solution { public String ReverseSentence(String str) { String result

2016-04-12 21:04:28 604

原创 剑指offer系列之41:和为s的连续整数序列

题目描述:输入一个整数s,输出所有的和为s的连续整数序列。思路:该题和“和为s的两个整数”思路一样,考虑用两个数small和big来表示序列的最小值和最大值,首先把small初始化为1,big初始化为2,如果从small到big的序列的和大于s,可以从序列中去掉较小的值,把small加1,如果从small到big的序列的和小于s,增大big使序列包含更多的元素。因为序列中至少要含有两个数字,可以一直

2016-04-12 20:08:02 245

原创 剑指offer系列之40:和为的两个数字

题目描述:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。思路:最慢的方法是固定一个数字,然后一次遍历数组得到和为s的另一个数字,但这种算法时间复杂度太高。因为数组是已经排序的,可以先在数组中选择两个数字,如果它们的和等于输入的s,就找到了要找的数字,如果它们的和小于s,则可以让较小的数字往后移动,如果它们的和大于s,则可以让较大的数字向前移动,知道和等于输入的s为止。

2016-04-12 20:02:31 305

原创 剑指offer系列之39:数组中只出现1次的数字

题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路1:借用java语言中的特定函数,可以实现,使用TreeSet中不允许有重复值的特性,可以得到数组中的单独数字,然后分别统计它们出现的次数。(这种方法需要使用java语言的特性)//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import

2016-04-12 19:53:05 267

原创 剑指offer系列之38:判断是否是平衡二叉树

题目描述:输入一颗二叉树的根节点,判断该二叉树是否是平衡二叉树。思路1:所谓平衡二叉树就对某个结点来讲,其左子树的深度与右子树深度的绝对值不超过1。由于需要对每个节点进行判断,所以可以采用递归的思路进行解决。具体思路是:先求出根节点的左右子树的深度,并对两者进行判断,如果没有满足左右子树的深度的绝对值不超过1的条件,那么就不是平衡二叉树。下一步,自然就是分别对根节点的左右子树进行递归判断了,这样一直

2016-04-12 19:44:32 298

原创 剑指offer系列之37:二叉树的深度

题目描述:输入一颗二叉树,求出该树的深度。(知识迁移能力)思路:如果一棵树只有一个节点,则其深度为1,如果根节点只有左子树而没有右子树,则树的深度应该是左子树的深度加1,如果根节点只有右子树而没有左子树,则树的深度应该是右子树的深度加1,如果既有左子树又有右子树,则深度应该是左右子树的深度的较大值加1.可以采用递归的方式实现。/**public class TreeNode { int v

2016-04-12 19:40:42 312

原创 剑指offer系列之36:数字在排序数组中出现的次数

题目描述:统计一个数字在排序数组中出现的次数。(知识迁移能力,二分查找的一个应用)思路:因为是排序数组,自然联想到二分查找算法,这样我们在二分的时候可能会获取多个相同的数字。就是说,中间那个位置的值可能刚好是统计的那个值,假设为k。那么k还有可能在前面或者后面出现,在这个基础上继续二分当然也是可以的,如果能够在使用二分查找算法的时候统计出第一个k和最后一个k出现的位置,那么k出现的次数自然就确定了。

2016-04-12 19:35:41 239

原创 剑指offer系列之35:两个链表的第一个公共节点

题目描述:输入两个链表,找出它们的第一个公共节点。两个有公共节点的单向链表的特点:如果两个链表有公共节点,那么这两个链表从某一节点开始,它们的m_pNext指针指向同一个节点,而且从第一个公共节点开始,之后它们的所有节点都是重合的,拓扑形状向Y,而不可能像X. 思路1:如果两个链表有公共的节点,则公共的节点出现在链表的尾部,如果从链表的尾部开始比较,则最后一个相同的节点就是要找的第一个公共节点,这

2016-04-12 19:22:37 254

原创 剑指offer系列之34:数组中的逆序对

题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路:

2016-04-12 19:12:44 243

原创 剑指offer系列之33:第一个只出现一次的字符

题目描述:在字符串中找出第一个只出现一次的字符。思路:第一个只出现一次的字符是关键,就意味着需要所有的字符进行出现次数的统计,所以我们需要两次遍历:第一次获取每个字符出现的次数;第二次把第一个只出现一次的字符找到。在Java中可以通过HashMap实现对每个字符次数的统计,由于在题目中并没有我们限定使用Java提供的内置结构,所以可以通过这种办法迅速找到第一个只出现一次的字符。

2016-04-12 16:52:10 250

原创 剑指offer系列之32:丑数

题目描述:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路1:一个数m是另一个数n的因子,则n能被m整除,即n % m = 0,根据丑数的定义,丑数只能被2、3、5整除,所以我们可以通过把一个数一直被三个因子除,这样最后如果该数变成1的话(因为第一个丑数是1),就意味

2016-04-12 16:43:05 304

原创 剑指offer系列之31:把数组排成最小的数

题目描述:输入一个正整数数组,把数组里所有的数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。思路:这道题目其实是让制定一个排序规则,数组根据这个排序规则排序之后就能得到最小的数字。根据题目规则,对于两个数字m和n,如果mn>nm,则m>n,这是重新定义的排序规则。import java.util.*;;public class Solution { public String P

2016-04-12 16:25:58 215

原创 剑指offer系列之30:从1到n整数中1出现的次数

题目描述:输入一个整数n,输出从1到n这n个十进制整数中1出现的次数。思路1:不考虑时间效率的办法(不推荐),累加1到n中每个整数1出现的次数,可以通过每次对10求余来判断个位数是不是1,然后把数字除以10。这种算法时间复杂度比较高。public class Solution { public int NumberOf1Between1AndN_Solution(int n) {

2016-04-12 16:17:06 213

原创 剑指offer系列之29:连续子数组的最大和

题目描述:输入一个整型数组,数组中一个或连续多个整数组成一个子数组,求所有子数组的和的最大值,要求时间复杂度为O(n)。思路:举例分析数组的规律,这实际上是一个逐步比较的过程,假设累加进行到某一步,继续累加下一个数的时候发现和变小了,就应该重新计算当前累加的和,这实际上就是一个重新赋值的过程。如果累加之后发现变大了,这当然是我们想要的,自然就继续累加了。累加之后再判断是否大于原来的最大值,如果不是的

2016-04-12 16:03:37 233

原创 剑指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

原创 剑指offer系列之27:数组中出现次数超过一半的数字

问题描述:数组中有一个数字出现的次数超过数组长度的一半,编写程序找出这个数字。

2016-04-12 14:58:39 206

原创 剑指offer系列之26:字符串的排列

题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:先不考虑是否出现重读字符,要对一个字符进行全排列,可以把第一个字符和后面的字符看成两部分,而第一个字符

2016-04-12 14:43:28 315

转载 剑指offer系列之25:二叉搜索树与双向链表

题目描述:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树种节点指针的指向。思路:由于二叉搜索树的中序遍历就是排序的,如果是构造单链表,只需要一次中序遍历就可以了,但现在需要构造双链表,也就是在中序遍历的过程中需要设置每个节点的left与right指针,现在问题是如何设置这两个指针?二叉搜索树有一个特点,就是根节点的左子树上所有节点都比根节点的值小,而

2016-04-12 14:26:31 290

原创 剑指offer系列之24:复杂链表的复制

题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。思路:第一步,复制原来链表的节点,并设置next指针,这一步不同于简单的复制节点,而是把每个复制的节点都链在原节点的后面,相当于复制节点之间隔了一个原节点;第二步,设置复制节点的特殊指针,由于在第一步左了特殊处理,所以当一个节点R的特殊指针指向节点N的时候,复制节点R’的特殊指针则是N

2016-04-12 14:14:45 332

原创 剑指offer系列之23:二叉树中和为某一值得路径

问题描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:由于路径是从树的根节点开始到叶节点结束,因此需要首先遍历根节点,树的前序遍历符合这个要求,当用前序遍历访问到某一节点时,把该节点添加到路径上,并累加该节点的值,如果该节点为叶结点并且路径中节点值得和等于目标值,则当前的路径符合要求,如果当前节点不

2016-04-12 12:53:45 350

原创 剑指offer系列之22:二叉搜索树的后序遍历

题目描述:输入一个整数数组,判断该整数数组是不是某二叉搜索树的后序遍历结果。思路:二叉搜索树(Binary Search Tree)的定义:它或者是一颗空树,或者是:若它的左子树不为空,则左子树上的所有节点的值小于根节点的值,若右子树不为空,则右子树上的所有节点的值大于根节点的值,左右子树也分别是二叉搜索树。 在后续遍历得到的序列中,最后一个数字是二叉树根节点的值,数组中的数字可以分为两

2016-04-12 09:28:57 347

原创 剑指offer系列之21:从上往下打印二叉树

题目描述:从上往下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。思路:这是属于二叉树的按层遍历,该题可以用到数据结构队列,每一次打印到一个节点的时候,如果该节点有子节点,则把该节点的子节点按照左右顺序放到队列的末尾,接下来到队列的头部取出最早进入队列的节点,重复打印操作,知道队列中的所有节点都被打印出来为止。import java.util.ArrayList;import java

2016-04-12 09:18:26 228

原创 剑指offer系列之20:栈的压入弹出序列

题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路:建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二序列的顺序依次从该栈中弹出数字。可以通过举例得到规律

2016-04-12 09:12:00 231

原创 剑指offer系列之19:包含min函数的栈

问题描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求调用min函数的时间复杂度为O(1),可以把每次的最小元素放到一个辅助栈中,能够保证辅助栈的栈顶一直都是最小元素当最小数据元素从数据站中弹出,同时弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。这样能够保证,取了最小元素后,下一次取的时次小的元素(仍然是最小的)。import java.util.Sta

2016-04-12 09:00:57 261

原创 剑指offer系列之18:顺时针打印矩阵

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。思路:这道题在算法上没有难度,关键在于设计一种逻辑容易理解,代码易于实现的转圈遍历方式,矩阵分圈处理能够解决很多其它的面试题。在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵,可以把打印一圈分为四步,第一部从左到右打印一行,第二步从上向下打印一列,第三步从右到左打印一行,第四部从下向上打印一列

2016-04-12 08:43:41 217

原创 剑指offer系列之17:二叉树的镜像

问题描述:完成一个函数,输入一个二叉树,该函数输出它的镜像。思路:解决这样问题的时候,可以通过画图来让抽象的问题具体化,前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点,当交换完所有非叶子结点的子节点后,就得到了树的镜像。/**public class TreeNode { int val = 0; TreeNode left = null; Tre

2016-04-12 08:31:51 218

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除