
剑指offer
文章平均质量分 53
sushauai
专业是软件工程,从事web端开发,对android有所涉猎但不多,目前还在读研究生。。。
github地址:sushauai.github.io
展开
-
剑指offer之面试题5:从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。 输入描述:输入为链表的表头输出描述:输出为需要打印的“新链表”的表头思路1:new一个临时的ArrayList(temp),遍历一遍链表,将链表的每个值顺序放进temp中;new一个新的ArrayList(list),遍历一遍temp,通过list.get(list.size()-1-i)获取倒序的链表元素,并顺序放进list中。最后返回li原创 2016-04-12 11:00:23 · 370 阅读 · 0 评论 -
剑指offer之面试题27:二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:采用中序遍历的思想(二叉搜索树中序遍历有序)。假设某一时刻遍历到根结点(结点10),则此时左子树已经转化成双向链表,用一个指针指向此时的尾结点,现在可将原来的二叉搜索树看成三部分:已经转化好的左子树,根结点,未转化的右子树。且此时尾结点的值<根结点<右子树,我们可以把他们连原创 2016-05-04 15:41:29 · 617 阅读 · 0 评论 -
剑指offer之面试题28:字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:把原字符串看成两部分:第一个字符,后面的所有字符。后面的字符又可看成:第一个字符,后面的字符…这是一个递归的原创 2016-05-04 17:26:55 · 383 阅读 · 0 评论 -
剑指offer之面试题10:二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:这是移到位运算题。直观解法,原数&1,相当于判断原数的最后一位是不是1,如果相&的结果为1,’1’的计数加1。然后原数右移一位,即把倒数第二位移到最后一位,并将右移后的数&1,…,直到原数的第一位移到最后,然后再右移,原数变为0循环结束。int numberOf1(int n){ int count=0;原创 2016-04-18 16:11:58 · 319 阅读 · 0 评论 -
剑指offer之面试题11:数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路:这道题看似很简单,习惯性地认为用一个循环,不断乘以base,即可:public double Power(double base, int exponent) { int result=1.0; for(int i=0;i<exponent;i++){原创 2016-04-21 16:26:08 · 339 阅读 · 0 评论 -
剑指offer之面试题12:打印1到最大的n位数
题目描述 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印1,2,3一直到最大的3位数即999思路:看似很简单的一道题:public static void Print1ToMaxOfDigits(int n){ int number=1; for(int i=0;i<n;i++){ number=number*10;原创 2016-04-21 18:30:42 · 338 阅读 · 0 评论 -
剑指offer之面试题12-1:大整数加减
题目描述定义一个函数,在该函数中可以实现任意两个整数的加法。由于没有限定输入两个数的大小范围,我们也要把它当做大数问题来处理思路: s1:用两个字符数组分别来保存两个数 case1:两个数一正一负 s2:如果是number1为正,number2为负 s3:比较两个数绝对值的大小,并把较大的当做number1 s4:符号和绝对值大者相同,这里可用flag,true表示‘+’(省略),f原创 2016-04-21 19:34:13 · 1130 阅读 · 0 评论 -
剑指offer之面试题13:在O(1)时间删除链表节点
题目描述给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点初始条件class ListNode{ int val; ListNode next; ListNode(int val){ this.val=val; }}思路:单向链表,删除结点,先找到该结点,从头遍历到待删除结点,时间O(n)。原创 2016-04-21 20:58:34 · 324 阅读 · 0 评论 -
剑指offer之面试题14:调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:拿到这一题,我想到了另外和这题类似的一道题,唯一不同是那个题目不要求奇数和奇数,偶数和偶数之间的相对位置不变。给出那道题的解法:两个指针,第一个指向首,先后移动;第二个指向尾,向前移动。在两指针相遇前,如果第一个指针原创 2016-04-21 21:47:10 · 398 阅读 · 0 评论 -
剑指offer之面试题29:数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路: 一般方法:先排序,然后统计每个数字出现的次数,O(nlogn) 其他方法: 数组中有一个数字出现的次数超过数组长度的一半,如果把这个数组排序,那么排序之后位于数字中间的数原创 2016-05-05 21:46:39 · 437 阅读 · 0 评论 -
剑指offer之面试题30:最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:如果不考虑时间效率的话,很容易想到就是把数组排序,直接用Arrays.sort(int[] a)方法可以对指定的 int 型数组按数字升序进行排序(但有一点注意,这样就会修改输入的数组)。该排序算法是一个经过调优的快速排序法,此算法在许多数据集上提供 n*log(n原创 2016-05-07 14:27:05 · 636 阅读 · 0 评论 -
剑指offer之面试题15:链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。思路:举个例子,{1,2,3,4,5,6}。倒数第3个为4,即正数第6-(3-1)个,i从1开始。据此我们可以得出一个方法:先遍历一边求出链表结点总个数n,然后从i=1开始找到第n-(k-1)个结点即可/*public class ListNode { int val; ListNode next = null; ListNo原创 2016-04-22 18:47:08 · 311 阅读 · 0 评论 -
剑指offer之面试题15-2:单链表是否有环
题目描述判断一个单链表是否形成了环形结构。思路:首先,有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,这道题和求链表的倒数第k个结点一样,采用的思想都是定义两个指针,使两指针在遍历时以某种方式错开,最后看两个指针是否相等。错开方式有两种。 solution1:使用pHead、pBehind两个指针,pHead一直向前走,pBeh原创 2016-04-23 15:35:07 · 1169 阅读 · 0 评论 -
剑指offer之面试题15-3:链表的中间结点
题目描述求链表的中间结点。如果链表中结点总数是奇数,返回中间结点;如果是偶数,返回中间结点的任意一个。思路:同样可以定义两个指针pFast、pSlow,pFast一次走两步,pSlow一次走一步,当pFast走到尾部时,pSlow恰好走到中间结点。public static ListNode midNode(ListNode head) { if(head==null)原创 2016-04-23 15:53:07 · 297 阅读 · 0 评论 -
剑指offer之面试题16:反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。思路:借助图形来分析一下反转链表需要改变哪些指针。假设某一时刻,经过若干操作,我们已经把h点之前的指针调整完毕,现在反转i指针指向的结点。 由图可知,为了防止指针的断开,需要保存i的next指针,为了完成反转,需要知道i的前一个指针prev,当然也要有个当前指针用作遍历链表,即总共三个指针分别是:pNode,pNext,pPrev。经过分析,可原创 2016-04-23 19:09:38 · 468 阅读 · 0 评论 -
剑指offer之面试题17:合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:养成好习惯,一旦有链表作为形参传递,都要对链表是否为空做判断,防止空指针异常,至于怎么处理,稍后会讲。当链表都不为空时,比较两个链表的头结点值的大小,较小者作为新的头结点保存,(不妨设较小的头结点来自list1)然后list1的下一个结点作为list1的一个新的头结点与list2的头结点比较,…原创 2016-04-23 21:19:14 · 382 阅读 · 0 评论 -
剑指offer之面试题9-3:变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:用数学归纳的思想,分析得出规律。 台阶数为1,先跳0阶,剩下一次跳完跳法为1;先跳一阶,剩下的跳法为f(0),由加法原理,f(1)=1+f(0) 台阶数为2,先跳0阶,剩下一次跳完跳法为1;先跳一阶,剩下的跳法为f(1);先跳2阶,剩下的跳法为f(0),由加法原理,f(2)原创 2016-04-18 15:06:19 · 365 阅读 · 0 评论 -
剑指offer之面试题9-4:矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:用数学归纳的思想分析,得出规律。牛客网提交代码:public class Solution { public static int RectCover(int target) { //用一个放置在最左边时有两个选择: /原创 2016-04-18 15:10:05 · 471 阅读 · 0 评论 -
剑指offer之面试题19:二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6原创 2016-04-25 15:45:27 · 355 阅读 · 0 评论 -
剑指offer之面试题20:顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.输入:1 2 3 45 6 7 89 10 11 1213 14 15 16输出:1,原创 2016-04-25 16:14:25 · 424 阅读 · 0 评论 -
剑指offer之面试题21:包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push以及pop的时间复杂度都是O(1)。思路: 第一种思路,可不可以每次push操作后,对栈中元素排序,使最小的元素位于栈顶?这样min操作可以保证在O(1)内完成,但pop操作就与栈的pop操作违背了(栈顶的元素不一定是最后进栈的,不是后进先出)。显然这种思路行不通,直接pass掉。第二种思路原创 2016-04-25 22:57:44 · 347 阅读 · 0 评论 -
剑指offer之面试题22:栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路:这是道很抽象的题,根据题目所给的例子验算一遍。4,5,3,2,1第一个出栈的4必须先入栈且在栈顶,入栈顺序按照序列1,2,3原创 2016-04-26 00:11:54 · 452 阅读 · 0 评论 -
剑指offer之面试题6:重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:二叉树前(先)序遍历:根,左,右;中序遍历:左,根,右;(注:先,中指的是根)。根据前序遍历序列可以得到此二叉树的根为1。再根据中序遍历序列,可知在1左原创 2016-04-12 11:25:25 · 454 阅读 · 0 评论 -
剑指offer之面试题23:从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。输入二叉树 8 / \ 6 10 / \ / \ 5 7 9 11输出 8,6,10,5,7,9,11思路:二叉树的层次遍历 初始化队列,结点8入队,结点8出队,8的孩子结点不为空,把8的孩子结点6,10放进队列中。6出队,原创 2016-04-26 11:58:33 · 386 阅读 · 0 评论 -
剑指offer之面试题24:二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。举个例子,如图所示二叉搜索树,左孩子结点值<根结点<右孩子结点值 8 / \ 6 10 / \ / \ 5 7 9 11则输入数组{5,7,6,9原创 2016-04-27 16:07:29 · 427 阅读 · 0 评论 -
剑指offer之面试题3:二维数组的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入描述: array: 待查找的二维数组target:查找的数字输出描述:查找到返回true,查找不到返回false思路1:不考虑数组本身的特点,遍历一个二维数组,判断元素值是否等于要查找的整数即可,时间复杂度O(n^2),原创 2016-04-11 20:18:10 · 520 阅读 · 0 评论 -
剑指offer之面试题25:二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。举个例子分析一下 10 / \ 5 12 / \ 4 7 和为22的路径有两条:{10,5,7},{10,12}怎么得到的? 首先需要先遍历每原创 2016-04-27 18:09:27 · 645 阅读 · 0 评论 -
剑指offer之面试题7:用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:push操作无所谓栈或队列,都是往里面加入元素。而区别在于pop操作,队列的pop操作取的是先push的元素,而栈pop的则是最后push的元素,怎样通过两个栈来实现队列的pop操作,是主要问题所在。举个例子,向stack1中逐个push进a,b,c,则stack1中元素{a,b,c},c位于栈顶,再将原创 2016-04-15 19:32:46 · 1627 阅读 · 1 评论 -
剑指offer之面试题:查找和排序
二分查找基本思想:将有序序列等分为几乎相等的两部份,待查关键字和划分元比较。如果小于划分元,则递归处理左半部分;否则处理右半部分。非递归算法:BinarySearch1(L[],n,x){ left=1; right=n; flag=0; while(left<=right&&flag==0){ mid=(left+right)/2;原创 2016-04-16 12:15:21 · 920 阅读 · 0 评论 -
剑指offer之面试题8:旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路:直接从头到尾遍历数组一次,即可public int minNumberInRotateArray(int [] array) { if(array==null||ar原创 2016-04-16 21:58:14 · 410 阅读 · 0 评论 -
剑指offer之面试题26:复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。结点的定义已给出/*public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int原创 2016-04-29 21:23:11 · 482 阅读 · 0 评论 -
剑指offer之面试题9:斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。思路:递归解法很简单public class Solution { public static int Fibonacci(int n) { return n<=1?n:(Fibonacci(n-1)+Fibonacci(n-2)); } public static void原创 2016-04-18 14:37:13 · 437 阅读 · 0 评论 -
剑指offer之面试题9-2:跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:可以使用数学归纳的思维方法,逐渐归纳出规律。 台阶数为1,只有一种跳法。 台阶数为2,两种跳法:{1,1}或{2} 台阶数为3,两种选择:先跳一阶,剩下的有f2种跳法;跳两阶,剩下的有f1种跳法。由加法原理,f3=f1+f2。 … 台阶数为n,两种选择:先跳一阶,剩下的有f(n-1)种跳原创 2016-04-18 14:49:42 · 352 阅读 · 0 评论 -
剑指offer之面试题18:树的子结构
题目描述输入两颗二叉树A,B,判断B是不是A的子结构。思路:二叉树的遍历&递归。 判断A的根节点和B的根节点是否相等:相等,递归判断A的左右子树是否和B的左右子树相等。若不相等,遍历到A的左子树根节点,同样的方法判断根节点是否相等…,遍历到A的右子树根节点,判断右子树根节点是否和B根节点相等。 代码如下:/**public class TreeNode { int val = 0;原创 2016-04-24 21:31:10 · 354 阅读 · 0 评论