剑指offer
文章平均质量分 50
gongpulin
这个作者很懒,什么都没留下…
展开
-
【剑指offer】二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 分析: 二维数组分析时常画为矩形,分析其四个顶点可以看出,左下角及右上角顶点有如下特点: (1)左下角顶点的上方都比此顶点数值小,其右方都比此顶点数值大; (2)右上角顶点的左方都比原创 2016-07-18 19:03:54 · 498 阅读 · 0 评论 -
【剑指offer】二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 仔细观察原二叉树与镜像二叉树,可以发现镜像二叉树实际上就是把每个节点的左右孩子结点进行了交换,比如在遍历到8这个节原创 2016-08-11 16:47:54 · 249 阅读 · 0 评论 -
【剑指offer】两个链表的第一个公共节点
题目描述 输入两个链表,找出它们的第一个公共结点。 由于是单链表,所以可以发现从第一个公共节点开始,后面的结点都是相同的,一种思路是从两个链表的尾部开始遍历,直到发现最后一个相同的结点为止,那么这最后一个相同的结点是单链表的角度看就是两个链表的第一个公共节点了。还有一种思路是不需要从尾部开始遍历,毕竟从尾部遍历单链表的话还得使用反转链表的方法进行操作,首先计算出两个链表的长度,让更长的原创 2016-09-01 15:36:57 · 406 阅读 · 0 评论 -
【剑指offer】链表中的倒数第k个节点
题目描述 输入一个链表,输出该链表中倒数第k个结点。 举一个简单的例子,比如链表{1,2,3,4,5},如果要返回倒数第二个节点,也就是k=2,就相当于正数第5-k+1=4个节点,所以我们可以采用两次循环:一次循环得到链表的结点个数;另一次循环则是从链表中找到第n-k+1个节点。虽然是两次循环,但时间复杂度是O(n) ,需要注意的是,这里仍然需要对链表的边界条件进行判断 pac原创 2016-08-09 17:22:09 · 307 阅读 · 0 评论 -
【剑指offer】合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 这道题我的第一思路这样的:可以先遍历这两个排序的链表,把遍历的结果存放在一个集合中,然后调用库函数Arrays.sort方法完成排序,之后,根据这些排好序的结果重新创建一个链表,即为合并之后但仍然排序的链表。但是这种思路需要额外的List和创建链表的空间开销,而且时间复杂度最快也是O原创 2016-08-31 10:38:10 · 265 阅读 · 0 评论 -
【剑指offer】连续子数组的最大和
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?原创 2016-08-31 10:24:42 · 246 阅读 · 0 评论 -
【剑指offer】第一个只出现一次的字符
题目描述 在一个字符串(1 第一个只出现一次的字符是关键,就意味着需要所有的字符进行出现次数的统计,所以我们需要两次遍历:第一次获取每个字符出现的次数;第二次把第一个只出现一次的字符找到。在Java中可以通过HashMap实现对每个字符次数的统计,由于在题目中并没有我们限定使用Java提供的内置结构,所以可以通过这种办法迅速找到第一个只出现一次的字符。 package com原创 2016-08-31 10:15:33 · 290 阅读 · 0 评论 -
【剑指offer】调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 这道题第一思路自然是这样的:从头开始遍历这个数组,如果遇到偶数就把这个数之后的所有数往前移动一位,这样数组会留出一个空位,移动完毕之后把该偶数放到该空位即可。这样处理的话需要两次循环,一次是遍历,另一次是原创 2016-08-09 16:16:11 · 303 阅读 · 0 评论 -
【剑指offer】数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 首先,我觉得这道题思路应该很简单,幂的情况无非是三种:正数、0和负数。当幂是0的时候,直接返回1;当幂是负数的时候,需要先把其转化为正数来处理,然后返回其倒数就可以了;当幂是正数的时候,按照正常的计算方法就可以。实际上这道题主要考察时代码的健壮性——就是对幂的情况的原创 2016-08-08 18:21:42 · 230 阅读 · 0 评论 -
【剑指offer】二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。比如输入9,9的二进制表示是1001,1的个数是2,所以输出2。 这有一个重要结论:一个数与该数减一的结果进行与运算,会把该数右边(低位)第一个1变为0,而该位左边保持不变(高位)。可以举一个简单的例子进行证明:比如1100(对应十进制是12),减去1之后的结果是1011(也就是十进制的11),两个数进行与运算原创 2016-08-08 18:05:43 · 309 阅读 · 0 评论 -
【剑指offer】矩形覆盖问题
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 我们采用从能够简单到复杂的思路思考这个问题,当n=1的时候,只有一个2*1的矩形,所以只有一种方法,记为f(1)=1;当n=2的时候,是两个2*1的矩形,这时候具有两种方式去覆盖这个矩形了(这时候应该是一个正方形),一种是竖着放,一种是横着放,所以有两种方法,记为原创 2016-08-08 18:04:12 · 376 阅读 · 0 评论 -
【剑指offer】跳台阶问题
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 这种问题的思路一般是采用数学归纳法,当n=1时,只有一种跳法;当n=2时,青蛙可以一次跳2级,也可以一次跳两级,需要跳两次,所以有两种跳法;当n=3的时候,首先考虑一次跳1级的情况,由于有3级,所以还有2级没跳,而跳两级的跳法已经在前面n=2的情况中计算得到了;下面考虑一次跳2级的情况原创 2016-08-08 17:59:11 · 363 阅读 · 0 评论 -
【剑指offer】反转链表
输入一个链表,反转链表后,输出链表的所有元素。 思路如下:在遍历链表上的每个节点的时候,就修改其指针,当遍历到最后一个结点的时候,整个链表就反转完成了。所以需要创建三个变量:一个是当前遍历的结点,一个是遍历结点的前一个结点,还有一个是当前遍历结点的下一个结点。 package com.gpl.offer.jianzhi; import java.util.Stack; /*原创 2016-08-17 18:29:43 · 302 阅读 · 0 评论 -
【剑指offer】包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求时间复杂度是O(1)。 还是先说一下思路吧,因为每次方元素进栈的时候不能保证栈顶元素都是最小的,所以需要想办法使得栈顶元素始终是最小的元素,排序是一种思路,但是每次排序还设计重新出栈和入栈,想来应该不是这样的。一种思路是可以利用一个辅助栈,相当于是以空间换时间了。具体思路是:当入栈的新元素原先栈顶元素小的话就该元素放入原创 2016-08-17 18:24:24 · 343 阅读 · 0 评论 -
【剑指offer】斐波那契数列
题目描述 斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 package com.gpl.offer.jianzhi; /** * Created by gpl on 2016/8/4. */ public class Fibonacci { public int fibonacci(int n){ if(n == 0)原创 2016-08-04 13:38:14 · 946 阅读 · 0 评论 -
【剑指offer】用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 栈的特点是先进后出,而队列的特点是先进先出。问题是如何把栈的出栈和入栈与队列的入队和出队联系起来?因为现在只有栈,所以在实现的队列中,只能先往栈中添加元素,这点比较好理解;那么出队呢,由于先进去的元素被压在栈底,而如果是队列的话,必须是栈底的那个元素先出队。现在可以使用第二个栈,思路是把原先原创 2016-08-04 12:10:23 · 912 阅读 · 0 评论 -
【剑指offer】替换空格
题目: 将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 分析: String为不可变类,需要对String进行内容操作时,可以考虑转为char[]或StringBuffer。 (1)操作char[]方式: 需要考虑数组元素移动造成的覆盖,因此考虑从后往前,将字符数组移动到新长度原创 2016-07-19 14:25:26 · 514 阅读 · 0 评论 -
【剑指offer】树的子结构
题目描述 输入两颗二叉树A,B,判断B是不是A的子结构。 这实际上二叉树遍历算法的一种应用,要在原二叉树中查找是否具有某课子树,只需要判断每个节点是否都在二叉树中是否出现即可。所以需要先判断头结点,只有头结点符合要求才继续比较其子树是否符合,一样依次从头结点开始比较直到其左右子树进行比较,如果都符合则说明B是A的子结构 package com.gpl.offer.jianzh原创 2016-08-11 16:50:47 · 237 阅读 · 0 评论