自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 资源 (1)
  • 收藏
  • 关注

原创 剑指offer——字符串空格替换

题目描述:请实现一个函数,将一个字符串中的空格替换成”%20”。例如,当字符串为We Are Happy,则经过替换之后的字符串为We%20Are%20Happy。思路:一组单词不是有空格嘛,所以直接使用String类的split函数直接分割为char数组不就好了,不过在这之前需要判断一下第一个位置和最后一个位置是否有空格,然后针对空格的出现情况再进行替换。发现OJ的时候,如你所猜,自然是失败的。因

2016-07-30 19:01:14 565

原创 剑指offer——从尾到头打印链表

题目描述:输入一个链表,从尾到头打印链表每个节点的值思路:用一个辅助存储栈来实现。代码实现:/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }*

2016-07-30 18:51:22 565

原创 剑指offer——在二维数组中查找元素

题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:由于题目条件的成立,所以使得这道题可以使用对角线的方法完成,可以从右上角的元素考虑,如果目标查找元素小于右上角的元素,那么不可能在右上角元素所在的列,如果目标大于剩余列的右上角的元素,那么不可能在该右上角元素所在的行。依

2016-07-30 18:45:12 536

原创 剑指offer——重建二叉树

题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:在完成代码之前,我自己分析了一下如何根据前序遍历和中序遍历的结果构建一棵二叉树。首先,根据二叉树遍历的性质,由前序遍历的结果序列可知该二叉树的根节点是

2016-07-30 15:50:02 426

原创 剑指offer——用两个栈实现队列

题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思想:栈的特点是先进后出,而队列的特点是先进先出。题目中提到使用两个栈实现队列,好像有戏。现在问题是如何把栈的出栈和入栈与队列的入队和出队联系起来?因为现在只有栈,所以在实现的队列中,只能先往栈中添加元素,这点比较好理解;那么出队呢,由于先进去的元素被压在栈底,而如果是队列的话,必须是栈底的那个元素先出队。

2016-07-30 15:16:25 382

原创 剑指offer——旋转数组的最小数字

题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0思路:这题其实不用考虑旋转数组的特性,采用顺序查找的方式也能很快写出实现代码。 不过也能使用二分查找的思想,快

2016-07-30 15:11:07 412

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

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

原创 剑指offer——跳台阶

题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:这种问题的思路一般是采用数学归纳法,当n=1时,只有一种跳法;当n=2时,青蛙可以一次跳2级,也可以一次跳两级,需要跳两次,所以有两种跳法;当n=3的时候,首先考虑一次跳1级的情况,由于有3级,所以还有2级没跳,而跳两级的跳法已经在前面n=2的情况中计算得到了;下面考虑一次跳2级的情况,同样跳完

2016-07-30 10:44:12 353

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

原创 剑指offer——二进制中1的个数

题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:一个数与该数减一的结果进行与运算,会把该数右边(低位)第一个1变为0,而该位左边保持不变(高位)。可以举一个简单的例子进行证明:比如1100(对应十进制是12),减去1之后的结果是1011(也就是十进制的11),两个数进行与运算之后,我们发现最后的结果是1000(对应十进制的8,当然这个8与后面没有关系,可以略过)。这样

2016-07-30 10:27:16 438

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

原创 剑指offer——调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:暴力法: 类似于冒泡排序,对相邻的两个数进行判断,如果前一个为偶数,后一个为奇数,则交换两者位置,所以需要两层循环,时间复杂度o(n2)代码实现:public class Solution { publi

2016-07-30 10:19:12 339

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

原创 剑指offer——反转链表

题目描述:输入一个链表,反转链表后,输出链表的所有元素。思路:在遍历链表上的每个节点的时候,就修改其指针,当遍历到最后一个结点的时候,整个链表就反转完成了。所以需要创建三个变量:一个是当前遍历的结点,一个是遍历结点的前一个结点,还有一个是当前遍历结点的下一个结点。代码实现:/*public class ListNode { int val; ListNode next = null

2016-07-29 23:54:51 486

原创 剑指offer——合并两个排序的链表

题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:可以先遍历这两个排序的链表,把遍历的结果存放在一个集合中,然后调用库函数Arrays.sort方法完成排序,之后,根据这些排好序的结果重新创建一个链表,即为合并之后但仍然排序的链表。但是这种思路需要额外的List和创建链表的空间开销,而且时间复杂度最快也是O(nlogn)。所以不是很理想。第二

2016-07-29 23:37:19 690

原创 剑指offer——树的子结构

题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:这实际上二叉树遍历算法的一种应用,要在原二叉树中查找是否具有某课子树,只需要判断每个节点是否都在二叉树中是否出现即可。所以需要先判断头结点,只有头结点符合要求才继续比较其子树是否符合,一样依次从头结点开始比较直到其左右子树进行比较,如果都符合则说明B是A的子结构。代码实现:/**public

2016-07-29 23:15:14 424

原创 剑指offer——二叉树的镜像

题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10

2016-07-29 22:57:54 1977

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

原创 剑指offer——包含min函数的栈

题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路:因为每次放元素进栈的时候不能保证栈顶元素都是最小的,所以需要想办法使得栈顶元素始终是最小的元素,排序是一种思路,但是每次排序还设计重新出栈和入栈,想来应该不是这样的。 一种思路是可以利用一个辅助栈,相当于是以空间换时间了。具体思路是:当入栈的新元素原先栈顶元素小的话就该元素放入一个辅助栈中,如果新入栈的元素比原先

2016-07-29 17:03:22 329

原创 剑指offer——栈的压入、弹出序列

题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:要判断一个序列是不是另一个序列的弹出序列,首先我们得知道栈的特点是FIFO,其次,由于压

2016-07-29 16:46:52 451

原创 剑指offer——从上到下打印二叉树

题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:此题实际上就是二叉树层序遍历方法的考察,具体思路是:使用一个集合(或者栈,但是相对来说使用栈操作会方便一些)来保存遍历的节点,还需要创建一个集合用来保存最后输出的遍历序列。从根节点开始遍历,首先把该节点放入集合中,并输出其值,之后便从集合中移除该节点,不过在此之前需要判断该节点是否有左右孩子,如果有左右(满足其一就可以)孩子,便把

2016-07-29 14:02:33 316

原创 剑指offer——二叉搜索树的后续遍历序列

题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:此题仍然是对二叉树遍历方法的考察,但是与直接对遍历方法的考察不太一样,因为这里的输入是后续遍历的序列,所以要判断该序列是否是某二叉树的后续遍历结果,关键在于找出根节点,根节点的左子树和根节点的右子树,然后继续对左子树和右子树进行判断,直到全部元素访

2016-07-29 11:01:33 412

原创 静态分派与动态分派

本文要解决的问题:深入理解Java虚拟机,本篇文章分析了静态分配和动态分配。这里所谓的分派指的是在Java中对方法的调用。Java中有三大特性:封装、继承和多态。分派是多态性的体现,Java虚拟机底层提供了我们开发中“重写”和“重载”的底层实现。其中重载属于静态分派,而重写则是动态分派的过程。除了使用分派的方式对方法进行调用之外,还可以使用解析调用,解析调用是在

2016-07-28 22:35:58 1050

原创 类加载机制

本文要解决的问题:深入理解Java虚拟机,本篇文章从类加载机制进行分析。虚拟机的类加载机制可以简单描述如下:Java虚拟机把描述类的数据从Class文件中加载到内存中,并对数据进行校验、解析和初始化,最终形成可以被虚拟机直接使用的Java类型。虚拟机加载进行类加载的过程是在程序运行期间完成的,在程序运行期间加载的好处是可以动态扩展,说白了就是在编译期间虚拟机是不

2016-07-28 22:31:48 872

原创 类文件结构

本文要解决的问题:深入理解Java虚拟机,本篇文章从类文件结构进行分析。我们平时在DOS界面中往往需要运行先运行javac命令,这个命令的直接结果就是产生相应的class文件,然后基于这个class文件才可以真正运行程序得到结果。自然。这是Java虚拟机的功劳,那么是不是Java虚拟机只能编译.java的源文件呢?答案是否定的。时至今日,Java虚拟机已经实现了

2016-07-28 22:25:18 911

原创 详解垃圾回收机制

本文要解决的问题:深入理解Java虚拟机,本篇文章进一步详细了解垃圾回收机制。前面已经对垃圾收集算法有了较为详细的介绍,这里我们将对JVM中具体的垃圾回收器进行介绍,在虚拟机规范中并没有对垃圾回收器如何实现具体介绍,因此每个厂商的垃圾回收器可能会完全不同,但是我们介绍的是基于JDK1.7之后的Hotspot虚拟机(包括前面对Java虚拟机的介绍也是基于jdk1.

2016-07-28 22:20:24 1116

原创 垃圾回收算法

本文要解决的问题:深入理解Java虚拟机,本篇文章进一步了解几种垃圾回收算法。垃圾收集算法是JVM中垃圾收集器的方法论,所以了解算法是必要的,在算法领域只做最简单的介绍,力求文章的简单易懂。垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep)、复制算法(copying)和标记-整理算法(mark-compact)。随着jdk版本的升级,

2016-07-28 22:13:15 1171

原创 垃圾收集器概述

本文要解决的问题:深入理解Java虚拟机,本篇文章简单讲一下垃圾收集的概述。我们知道Java的内存区域分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区,而且其中的程序计数器、虚拟机栈和本地方法栈都是线程独立的,也就是说这三块内存区域的生命周期与线程是同生共死的。栈中帧栈在类结构确定的时候就已经知道该分配多少内存了,所以当线程结束的时候,内存也跟着一起回收了,从这

2016-07-28 22:00:56 502

原创 Java内存区域

本文要解决的问题:深入理解Java虚拟机,本篇文章从Java内存区域开始分析。Java虚拟机运行时数据区分为以下几个部分: 方法区、虚拟机栈、本地方法栈、堆、程序计数器。如下图所示:程序计数器程序计数器可以理解为当前线程执行的字节码的行号指示器,字节码解释器就是通哟改变这个值来获取需要执行的下一条需要执行的字节码指令。对于多线程来说,每条线程都有自己

2016-07-28 20:44:42 497

原创 剑指offer——二叉树中和为某一值的路径

题目描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:由于是从根节点开始遍历的,所以自然联想到前序遍历,但是问题并没有那么简单,在遍历的过程中需要记录遍历的所有节点值的和,当某条路径遍历完毕之后,还需要切换到另一个节点,比如从某个节点的左孩子切换到右孩子,然后需要重新计算总和,并且需要减去原来那个节

2016-07-28 20:35:46 490

原创 剑指offer——复杂链表的复制

题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路:第一步,复制原来链表的节点,并设置next指针,这一步不同于简单的复制节点,而是把每个复制的节点都链在原节点的后面,相当于复制节点之间隔了一个原节点;第二步,设置复制节点的

2016-07-28 20:12:35 353

原创 剑指offer——二叉搜索树与双向链表

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

2016-07-28 19:34:13 295

原创 剑指offer——字符串的排列

题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。思路:此题与剑指offer原题存在一些初入,在原题中并没有规定字符串中字符是否有重复的出现。不过思路是一

2016-07-28 18:53:09 362

原创 剑指offer——数组中出现次数超过一半的数字

题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路:由于是一个数字,因为其次数超过1,那么其出现的出现综合肯定实际大于其他所有数字之和的。因为如此,我们可以设置一个变量用于辨识这个变量,遇到相同的数字就把次数增加1,如果没有没有

2016-07-28 14:47:48 281

原创 剑指offer——最小的K个数

题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:暴力方法就是:先排序,再取前k个最小的值。 由于是n个整数,我们完全可以使用Java API中的函数完成这一功能,首先把数组中的元素添加到list集合对象中,然后调用Collections.sort()函数,完成排序(这个过程的时间复杂度是O(nlogn),因为

2016-07-28 14:25:33 366

原创 剑指offer——连续子数组的最大和

题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?解法一:举例分析

2016-07-28 13:39:04 437

原创 剑指offer——整数中1出现的次数(从1到n整数中1出现的次数)

题目描述:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。思路:有一种比较简洁的思路:由于是一个整数区间,所以可以对每一个数进行判断,那么如何判断某个数中1出现了多少次

2016-07-28 11:02:25 1201 2

原创 剑指offer——把数组排成最小的数

题目描述:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:根据结果判断,所谓最小的数字实际上就是对数组中所有元素的一个组合。一种笨拙的方法是求出所有元素的全排列,然后对所有排列的值的大小进行排序,那么就可以得到最小的数了。那么是不是还有其他思路呢?联想到Java库函数

2016-07-27 23:43:30 586

原创 剑指offer——丑数

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

2016-07-27 22:25:30 678

vi使用方法

vi的使用,使用比较方便。用于操作系统。。

2012-12-10

空空如也

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

TA关注的人

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