剑指offer
sbq63683210
这个作者很懒,什么都没留下…
展开
-
剑指offer——扑克牌顺子
题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面原创 2016-07-22 11:06:40 · 463 阅读 · 0 评论 -
剑指offer——矩形覆盖问题
题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路:我们采用从能够简单到复杂的思路思考这个问题,当n=1的时候,只有一个2*1的矩形,所以只有一种方法,记为f(1)=1;当n=2的时候,是两个2*1的矩形,这时候具有两种方式去覆盖这个矩形了(这时候应该是一个正方形),一种是竖着放,一种是横着放,所以有两种方法原创 2016-07-30 10:35:05 · 2540 阅读 · 1 评论 -
剑指offer——二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:一个数与该数减一的结果进行与运算,会把该数右边(低位)第一个1变为0,而该位左边保持不变(高位)。可以举一个简单的例子进行证明:比如1100(对应十进制是12),减去1之后的结果是1011(也就是十进制的11),两个数进行与运算之后,我们发现最后的结果是1000(对应十进制的8,当然这个8与后面没有关系,可以略过)。这样原创 2016-07-30 10:27:16 · 453 阅读 · 0 评论 -
剑指offer——数值的整数次方
题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路:不要漏掉情况,exponent分别需要考虑0,负数,正数三种情况。代码实现:public class Solution { public double Power(double base, int exponent) { if(exponent==0)原创 2016-07-30 10:24:03 · 340 阅读 · 0 评论 -
剑指offer——调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:暴力法: 类似于冒泡排序,对相邻的两个数进行判断,如果前一个为偶数,后一个为奇数,则交换两者位置,所以需要两层循环,时间复杂度o(n2)代码实现:public class Solution { publi原创 2016-07-30 10:19:12 · 351 阅读 · 0 评论 -
剑指offer——链表中倒数第k个结点
题目描述:输入一个链表,输出该链表中倒数第k个结点。思路:定义两个指针,一个先走k-1步,然后两个指针同时往后走,直到一个指针为空,则另一个指针指向的即倒数第k个结点。代码实现:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val;原创 2016-07-30 09:57:57 · 342 阅读 · 0 评论 -
剑指offer——反转链表
题目描述:输入一个链表,反转链表后,输出链表的所有元素。思路:在遍历链表上的每个节点的时候,就修改其指针,当遍历到最后一个结点的时候,整个链表就反转完成了。所以需要创建三个变量:一个是当前遍历的结点,一个是遍历结点的前一个结点,还有一个是当前遍历结点的下一个结点。代码实现:/*public class ListNode { int val; ListNode next = null原创 2016-07-29 23:54:51 · 494 阅读 · 0 评论 -
剑指offer——合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:可以先遍历这两个排序的链表,把遍历的结果存放在一个集合中,然后调用库函数Arrays.sort方法完成排序,之后,根据这些排好序的结果重新创建一个链表,即为合并之后但仍然排序的链表。但是这种思路需要额外的List和创建链表的空间开销,而且时间复杂度最快也是O(nlogn)。所以不是很理想。第二原创 2016-07-29 23:37:19 · 708 阅读 · 0 评论 -
剑指offer——树的子结构
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:这实际上二叉树遍历算法的一种应用,要在原二叉树中查找是否具有某课子树,只需要判断每个节点是否都在二叉树中是否出现即可。所以需要先判断头结点,只有头结点符合要求才继续比较其子树是否符合,一样依次从头结点开始比较直到其左右子树进行比较,如果都符合则说明B是A的子结构。代码实现:/**public原创 2016-07-29 23:15:14 · 430 阅读 · 0 评论 -
剑指offer——二叉树的镜像
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10原创 2016-07-29 22:57:54 · 2035 阅读 · 0 评论 -
剑指offer——表示数值的字符串
题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。思路:这里是判断是否一个字符串可以转为数值。从测试用例来看,表示的字符串有三类:整数、浮点数和科学计数法表示的数值。那么基本思路就是根据这三种类原创 2016-07-19 23:08:39 · 1354 阅读 · 0 评论 -
剑指offer——字符流中第一个不重复的字符
问题描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路:用HashMap保存已经出现的字符,另外再用一个ArrayList集合来存储只出现一次的字符,其中集合的第一个原创 2016-07-19 22:32:28 · 406 阅读 · 0 评论 -
剑指offer——按之字形顺序打印二叉树
问题描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路:之字形打印其实与上一个按层次打印基本相同,唯一不同的是每一层的顺序不一样,所以在这里可以定义一个变量,打印一层之后将其与1异或,作为打印顺序的标志位。代码实现:import java.util.ArrayList;import java.u原创 2016-07-19 21:23:54 · 2173 阅读 · 0 评论 -
剑指offer——把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路:用一个队列保存需要打印的结点,另外需要定义两个变量,一个表示当前层已经打印的结点数,另一个表示当前层需要打印的总数。当两个变量相等时,表明当前层打印完毕,进入下一层。代码实现:import java.util.ArrayList;import java.util.Queue;import java.util.Link原创 2016-07-19 20:48:35 · 450 阅读 · 0 评论 -
剑指offer——序列化二叉树
题目描述:请实现两个函数,分别用来序列化和反序列化二叉树。思路:首先得理解题目的意思,序列化就是返回一个带有#和逗号的字符串。反序列化就是根据带有#和逗号的字符串返回一棵二叉树。比如对于二叉树 1 / \ 2 3 /\ /\4 5 6 7来讲,序列化的结果是1,2,#,#,3,4,#,7,#,#,5,#,#,。而反序列化的结果则是输出一棵二叉树。代码实现:/*pu原创 2016-06-23 21:12:39 · 1508 阅读 · 0 评论 -
剑指offer——跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:这种问题的思路一般是采用数学归纳法,当n=1时,只有一种跳法;当n=2时,青蛙可以一次跳2级,也可以一次跳两级,需要跳两次,所以有两种跳法;当n=3的时候,首先考虑一次跳1级的情况,由于有3级,所以还有2级没跳,而跳两级的跳法已经在前面n=2的情况中计算得到了;下面考虑一次跳2级的情况,同样跳完原创 2016-07-30 10:44:12 · 365 阅读 · 0 评论 -
剑指offer——变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:现在青蛙的能力升级了,不仅能一次跳1级,还能一次跳n级,这是了不起的进步(说笑的)。不管如何,我们仍然使用数学归纳法进行分析:当n=1时,跳法只有1种,用f(1)=f(1-1)=1表示,下同; 当n=2时,可以一次跳1级,跳两次,也可以一次两2级,跳法有2种,f(2) =原创 2016-07-30 10:51:13 · 488 阅读 · 0 评论 -
剑指offer——正则表达式匹配
题目描述:请实现一个函数用来匹配包括’.’和’*‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”aba”均不匹配思路:由于只涉及两种正则表达式的匹配,所以关键是需要分清除匹配的所有情况,对于模式串来讲,出现了’.’和原创 2016-07-19 23:14:18 · 466 阅读 · 0 评论 -
剑指offer——翻转单词顺序
题目描述:最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思想:可以发现,要对一个句子进行原创 2016-07-21 17:16:24 · 588 阅读 · 0 评论 -
剑指offer——左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:可以把需要左旋的字符串看成一部分,其他的字符串看成另一部分,比如字符串“abcdef”,需要输出原创 2016-07-21 16:35:28 · 886 阅读 · 0 评论 -
剑指offer——求1到n的和
题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:如果不能使用上面的操作,那么只能使用递归操作了。使用递归操作的思路是让函数不断调用自己,每调用一次值就减少1,这样完成了递归操作。还有一个问题是如何实现n范围的判断呢?注意到递归调用的n的值最小是1,所以可以通过逻辑与运算,判断是否递归到1。如果递原创 2016-07-21 15:52:57 · 434 阅读 · 0 评论 -
剑指offer——不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:既然不能使用加减乘除,那么只剩下位运算和逻辑运算了。采用位运算的思路分为三步走:第一步,不进位对两个做异或运算(因为不考虑进位,1与1,0与0的异或运算的结果刚好是两者相加的结果);第二步,通过与运算得到两个数的进位值,因为只有1与1进行与运算的时候才会产生进位,所以产生的进位可以看成是两者先进行与运算再左原创 2016-07-21 14:34:14 · 463 阅读 · 0 评论 -
剑指offer——把字符串转换成整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。边界条件: 数据上下 溢出 空字符串 只有正负号 有无正负号 错误标志输出思路:这里的关键是要对输入的字符串进行全面的考虑。包括字符串是否有效的判断、是否是负数以及字符串表示的整数是否越界等问题。对于字符串有效性的判断主要是null以及空串的判定;负数之所以需要判断是因为在计算的时候是有用的;而是否越界的问题也是需要原创 2016-07-20 17:03:46 · 601 阅读 · 0 评论 -
剑指offer——数组中重复的数字
问题描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。思路:方法一:创建一个容器map,key为出现的数字,value为出现的次数,在遍历数组的过程中,若容器中已经有该数字,那么直原创 2016-07-20 16:03:12 · 740 阅读 · 0 评论 -
剑指offer——字符串空格替换
题目描述:请实现一个函数,将一个字符串中的空格替换成”%20”。例如,当字符串为We Are Happy,则经过替换之后的字符串为We%20Are%20Happy。思路:一组单词不是有空格嘛,所以直接使用String类的split函数直接分割为char数组不就好了,不过在这之前需要判断一下第一个位置和最后一个位置是否有空格,然后针对空格的出现情况再进行替换。发现OJ的时候,如你所猜,自然是失败的。因原创 2016-07-30 19:01:14 · 575 阅读 · 0 评论 -
剑指offer——从尾到头打印链表
题目描述:输入一个链表,从尾到头打印链表每个节点的值思路:用一个辅助存储栈来实现。代码实现:/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }*原创 2016-07-30 18:51:22 · 576 阅读 · 0 评论 -
剑指offer——在二维数组中查找元素
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:由于题目条件的成立,所以使得这道题可以使用对角线的方法完成,可以从右上角的元素考虑,如果目标查找元素小于右上角的元素,那么不可能在右上角元素所在的列,如果目标大于剩余列的右上角的元素,那么不可能在该右上角元素所在的行。依原创 2016-07-30 18:45:12 · 551 阅读 · 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]。不能使用除法。思路:把前半部分与后半部分保存到两个不同的数组中,用front[i]表示从A[0]…到A[i - 1]的值,用 back[i]表示从A[i + 1]…到A[n - 1]的值,循环一次,将结果保存在两个数组中,再遍历一次原创 2016-07-20 14:56:05 · 1116 阅读 · 0 评论 -
剑指offer——重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:在完成代码之前,我自己分析了一下如何根据前序遍历和中序遍历的结果构建一棵二叉树。首先,根据二叉树遍历的性质,由前序遍历的结果序列可知该二叉树的根节点是原创 2016-07-30 15:50:02 · 436 阅读 · 0 评论 -
剑指offer——用两个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思想:栈的特点是先进后出,而队列的特点是先进先出。题目中提到使用两个栈实现队列,好像有戏。现在问题是如何把栈的出栈和入栈与队列的入队和出队联系起来?因为现在只有栈,所以在实现的队列中,只能先往栈中添加元素,这点比较好理解;那么出队呢,由于先进去的元素被压在栈底,而如果是队列的话,必须是栈底的那个元素先出队。原创 2016-07-30 15:16:25 · 393 阅读 · 0 评论 -
剑指offer——旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0思路:这题其实不用考虑旋转数组的特性,采用顺序查找的方式也能很快写出实现代码。 不过也能使用二分查找的思想,快原创 2016-07-30 15:11:07 · 426 阅读 · 0 评论 -
剑指offer——斐波那契数列
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39思路:比较简单,就是一个循环的事情。但要特殊考虑前几个值。代码实现:public class Solution { public int Fibonacci(int n) { int a=1,b=1,c=0; if(n<=0){ ret原创 2016-07-30 11:09:17 · 451 阅读 · 0 评论 -
剑指offer——顺时针打印矩阵
题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.思路:由于每打印完一圈都会改变其起始坐标,所以需要先确定矩阵大小与这个起始坐标的关系,比如一个4阶矩阵,第一圈的起始坐标是(0,0)原创 2016-07-29 17:12:38 · 397 阅读 · 0 评论 -
剑指offer——包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路:因为每次放元素进栈的时候不能保证栈顶元素都是最小的,所以需要想办法使得栈顶元素始终是最小的元素,排序是一种思路,但是每次排序还设计重新出栈和入栈,想来应该不是这样的。 一种思路是可以利用一个辅助栈,相当于是以空间换时间了。具体思路是:当入栈的新元素原先栈顶元素小的话就该元素放入一个辅助栈中,如果新入栈的元素比原先原创 2016-07-29 17:03:22 · 339 阅读 · 0 评论 -
剑指offer——数组中的逆序对
题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100原创 2016-07-27 21:40:01 · 450 阅读 · 0 评论 -
剑指offer——二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路:根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况:1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点;2、没有右子树,则原创 2016-07-06 15:34:52 · 2895 阅读 · 1 评论 -
剑指offer——两个链表的第一个公共结点
题目描述:输入两个链表,找出它们的第一个公共结点。思路:由于是单链表,所以可以发现从第一个公共节点开始,后面的结点都是相同的,一种思路是从两个链表的尾部开始遍历,直到发现最后一个相同的结点为止,那么这最后一个相同的结点是单链表的角度看就是两个链表的第一个公共节点了。还有一种思路是不需要从尾部开始遍历,毕竟从尾部遍历单链表的话还得使用反转链表的方法进行操作,首先计算出两个链表的长度,让更长的那个单链表原创 2016-07-27 15:46:49 · 399 阅读 · 0 评论 -
剑指offer——数字在排序数组中出现的次数
题目描述:统计一个数字在排序数组中出现的次数。思路:因为是排序数组,自然联想到二分查找算法,这样我们在二分的时候可能会获取多个相同的数字。就是说,中间那个位置的值可能刚好是统计的那个值,假设为k。那么k还有可能在前面或者后面出现,在这个基础上继续二分当然也是可以的,如果能够在使用二分查找算法的时候统计出第一个k和最后一个k出现的位置,那么k出现的次数自然就确定了。第一个k出现的位置,可以使用二分查找原创 2016-07-27 15:20:39 · 590 阅读 · 0 评论 -
剑指offer——二叉树的深度
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:如果二叉树只有根节点那么深度就是1,如果只有左子树,那么就是左子树的深度加1就是整棵二叉树的深度;如果只有右子树,那么二叉树的深度就是右子树的深度加1;如果既有左子树又有右子树,那么二叉树的深度就是左右子树中深度更大的深度加1了。根据这个过程,自然发现,实际上只需要原创 2016-07-27 14:25:43 · 357 阅读 · 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],2原创 2016-06-18 22:47:21 · 1038 阅读 · 0 评论