04 2012 档案

摘要:题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中左边儿茶搜索树,则输出转换后的排序双向链表。 10 / \ 6 14 / \ / \ 4 8 12 164=6=8=10=12=14=16将二叉搜索树转化为有序双向链表,类似于中序遍历,中序遍历的结果就是一个排序的数字。因此在程序中以中序遍历树,当遍历左子树到在叶子结点的时候,开始修改指针。代码实例:View Code #include<iostream>#include<stdlib.h>using namespace st... 阅读全文
posted @ 2012-04-28 16:02 xwdreamer 阅读(4383) 评论(2) 推荐(0) 编辑
摘要:题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。这是一个典型的递归问题,考虑如何将复杂问题分解成简单问题,最后通过递归解决。我们肯定有这样的经验,自己在写abc的全排列的时候,肯定会想首先确定第一个字符,然后考虑后面有什么排列,比如确定第一个字符为a,那么剩下的b和c有两种排列,分别是bc和cb,那么以a开头的字符串有abc,acb这两种排列。这就是我们下面程序所需要用到的解题思路。将字符串排列分解为字符串的第一个字符以及其后的剩余字符。剩余字符串又可以按照前面的思路来解决 阅读全文
posted @ 2012-04-27 21:42 xwdreamer 阅读(1068) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。看到这道题目,最直观的想法,就是先算出链表的长度n,然后倒数第k个结点就是顺序的第(n-k+1)个数,不过这样需要2次遍历链表,如果要求只能遍历链表一次,那么上述算法就不符合要求了。那我们就使用第二种算法,设定两个指针p1和p2,两个指针刚开始都指向链表的第一个结点,然后让p1指针先走(k-1)步,然后再让两个指针一起往后走,当p1指针指向链表最后一个结点的时候 阅读全文
posted @ 2012-04-27 13:03 xwdreamer 阅读(4800) 评论(1) 推荐(1) 编辑
摘要:题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。假设有链表A->B->C->D->E->F->G。在反转链表过程中的某一阶段,其链表指针指向为:A<-B<-C<-D E->F->G。也就是说在结点D之前的所有结点都已经反转,而结点D后面的结点E开始的所有结点都没有反转。这样D跟E之间存在了断裂。我们如果要实现链表的反转,会有以下几个重要步骤:D->E变为D->C,指针反转指针往后移动一个,操作下一个结点E结合1.2我们发现需要操作3个指针,分别是C,D,E。因此可以考虑存储C/D/E三个 阅读全文
posted @ 2012-04-26 23:24 xwdreamer 阅读(13573) 评论(1) 推荐(0) 编辑
摘要:题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);删除结点的操作我们经常碰到,比如一个链表A->B->C->D->E->F->G。如果我们要删除结点E,那么我们只需要让结点D的指针指向结点F即可,但是我们现在只给出链表头结点的指针以及结点E的指针,而又是单项链表,不能在O(1)时间内 阅读全文
posted @ 2012-04-26 22:07 xwdreamer 阅读(4265) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。我们知道链表的特性,查找其中某一个结点的时间复杂度是O(n),不像数组那样可以直接通过下表在O(1)的时间内查找到指定元素。因此如果要查找链表元素,我们必须从头结点开始顺序往后查找。现在需要输出链表中的每个结点的值,而必须是从尾到头的,也就是先遍历的结点后输出,一个典型的“先进后出”的数据结构,这就让我们想到了栈的结构,如果我们在遍历链表的时候,将遍历的结果存放在一个栈中,遍历结束以后输出栈中的元素值,就是我们需要的从尾到头打印链表结点值。下面给出代码实例,在代码实例中还包括了创建单链表结点的方法CreateListNode(),往 阅读全文
posted @ 2012-04-26 20:05 xwdreamer 阅读(3192) 评论(0) 推荐(0) 编辑
摘要:1.RuntimeException今天摩根IT电面的时候被问到Exception和RuntimeException的区别,当时答不出来,大囧,晚上来学习一下。首先看一段代码,主要内容就是将字符串类型的数字转化为整型的数字,然后让两个数字相乘,代码如下:View Code public class RuntimeException { public static void main(String[] args) { // TODO Auto-generated method stub String str="123"; int temp=Inte... 阅读全文
posted @ 2012-04-24 21:12 xwdreamer 阅读(3817) 评论(1) 推荐(0) 编辑
摘要:java的比较器有两类,分别是Comparable接口和Comparator接口。在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口。让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下:View Code class Student implements Comparable<Student>{ private String name; private int age; private float... 阅读全文
posted @ 2012-04-17 23:40 xwdreamer 阅读(13157) 评论(0) 推荐(4) 编辑
摘要:1.finalfinal修饰类,说明这个类不能被继承,是以个顶级类。final修饰变量,说明这个变量是常量。final修饰方法,表示这个方法不能被重写,不过可以冲在final方法。比如有个基类Person,里面有一个public final void eat()方法,可以在Person类中重载同名方法,比如public void eat(String name,int age)。假如有一个子类Student,那么在Student中可以override父类的非final方法,但是不能override final方法。PersonView Code package test2;public cla 阅读全文
posted @ 2012-04-17 19:28 xwdreamer 阅读(1604) 评论(0) 推荐(0) 编辑
摘要:int *p[3]与int(*p)[3]的区别*p[3]这个是一个指针数组,它所代表的意思是数组中的每一个元素都是一个指针变量,而(*p)[3],p是一个指针变量,表示指向一个含有3个整型元素的一维数组。View Code int i,j; int a[2][3]={3,4,5,6,7,8}; // int *p[3] ; //表示一个数组,数组中的元素是指针类型,一共有三个元素 int (*q)[3]; //是一个指针,指向一个含有三个int型的数组(q+1)会跳三个数组元素 //把第一行三个元素地址存放在p指针数组中 for( i=0;i<3;++i... 阅读全文
posted @ 2012-04-13 15:06 xwdreamer 阅读(1854) 评论(0) 推荐(0) 编辑
摘要:对于指针和常量,有以下三种形式都是正确的:const char * myPtr = &char_A;//指向常量的指针char * const myPtr = &char_A;//常量的指针const char * const myPtr = &char_A;//指向常量的常量指针下面依次对这三种类型进行介绍。因为*操作符是左操作符,左操作符的优先级是从右到左,对于1.常量指针(Constant Pointers)int * const p先看const再看* ,是p是一个常量类型的指针,不能修改这个指针的指向,但是这个指针所指向的地址上存储的值可以修改。实例1:Vie 阅读全文
posted @ 2012-04-12 19:32 xwdreamer 阅读(34619) 评论(3) 推荐(6) 编辑
摘要:c++虚函数定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数[1]语法:virtual 函数返回类型 函数名(参数表) { 函数体 }用途:实现多态性,通过指向派生类的基类指针,访问派生类中同名覆盖成员函数,也就是允许子类override父类同名方法。虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型(也就是完全相同的方法,不能只是函数名相同。)。以实现统一的接口,不同的定义过程。如果在派生类中没有对虚函数重新定义, 阅读全文
posted @ 2012-04-12 16:33 xwdreamer 阅读(967) 评论(0) 推荐(0) 编辑
摘要:代码块分为四类普通代码块,构造块,静态代码块,同步代码块。View Code class Demo{ {//定义构造块 System.out.println("Demo的构造块"); } static{//定义静态代码块 System.out.println("Demo的静态代码块"); } public Demo()//定义构造方法 { System.out.println("Demo的构造方法"); }}public class CodeDemo { {//定义构造块 System.ou... 阅读全文
posted @ 2012-04-11 20:27 xwdreamer 阅读(556) 评论(0) 推荐(0) 编辑
摘要:参考文献参考1:http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns参考2:http://en.wikipedia.org/wiki/Design_pattern_(computer_science)参考3:http://zh.wikipedia.org/wiki/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F_(%E8%AE%A1%E7%AE%97%E6%9C%BA)正文You can find an overview of a lot design patterns i 阅读全文
posted @ 2012-04-11 19:18 xwdreamer 阅读(875) 评论(0) 推荐(0) 编辑
摘要:1.抽象类与普通类抽象类就是比普通类多定义了一个抽象方法,出除了不能直接进行对象的实例化操作之外并没有任何的不同一个抽象类不可以使用final关键字声明,因为final声明的类表示不能被继承,而抽象类又必须辈子类重写。一个抽象类可以定义构造方法。抽象方法不要使用private声明:在使用abstract关键字修饰方法时不能使用private修饰,因为抽象方法必须被子类覆写,而如果使用了private声明,则子类是无法覆写的。在java中允许一个抽象类实现多个接口,而且抽象类实现接口可以不必实现接口中定义的方法。实例如下:1.1抽象类实现接口定义接口interface1View Code pub 阅读全文
posted @ 2012-04-11 10:13 xwdreamer 阅读(1033) 评论(0) 推荐(0) 编辑
摘要:从写java至今,写的最多的可能就是主函数public static void main(String[] args) {}但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要求。其实这是一个不需要解释的问题,因为java标准就是这么规定的,那么既然是java标准规定的,我们按照规定来执行就好了。不过,这并不是一个很好的学习态度,如果总是知其然而不知其所以然,总会对java有种隔膜的感觉。就是发现问题了,不去解决,不去了解为什么,心里总是会有牵绊。今天既然自己都这么问自己了,为什么java的主函数要按照这个格式来写,那么我就得弄明白为什么。在java中,main()方法是j 阅读全文
posted @ 2012-04-09 13:51 xwdreamer 阅读(56728) 评论(7) 推荐(5) 编辑
摘要:1.排序算法简要比较名称数据对象稳定性时间复杂度空间复杂度描述平均最坏插入排序数组、链表√O(1)(有序区,无序区)。把无序区的第一个元素插入到有序区的合适的位置。对数组:比较得少,换得多。直接选择排序数组×O(1)(有序区,无序区)。在无序区里找一个最小的元素跟在有序区的后面。 对数组:比较得多,换得少。链表√堆排序数组×O(nlogn)O(1)(最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。归并排序数组、链表√O(nlogn)O(n) +O(logn) , 如果不是从下到上把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行 阅读全文
posted @ 2012-04-06 19:06 xwdreamer 阅读(4436) 评论(0) 推荐(0) 编辑
摘要:1.解析Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。p 阅读全文
posted @ 2012-04-06 13:07 xwdreamer 阅读(58783) 评论(0) 推荐(2) 编辑
摘要:0.参考资料:http://www.j2megame.org/index.php/content/view/2246/125.html1.Java的内存机制 Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁。分配给它的内存会被回收),Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用 阅读全文
posted @ 2012-04-01 15:26 xwdreamer 阅读(46968) 评论(10) 推荐(25) 编辑
摘要:参考文献:C++中构造函数与析构函数的调用顺序1.形参与实参形参:是函数声明时的参数,只说明参数名和类型,不是实际的参数,不能真正使用。实参:运行时传给函数的参数,是实际的变量,形参在这时真正被分配空间,并复制了实参的值。一个函数的实参在内存中有自己固定的内存,直到函数执行结束才释放内存。而形参没有固定的内存,只在调用函数的时候有一个虚拟内存,等调用完毕就不再有内存。。他们的关系是在函数调用的时候,实参把值传给形参。2.构造函数构造函数不能有返回值,函数名为类名。缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空。缺省构造函数是不带参数的。创建 阅读全文
posted @ 2012-04-01 09:58 xwdreamer 阅读(4639) 评论(0) 推荐(0) 编辑
摘要:参考文献:http://www.360doc.com/content/07/1122/09/9426_838237.shtmljava程序只有传值,没有传引用,传地址的说法。但是传递的值可以是具体的数值,也可以是一个对象的引用。可以用这样一句话来描述“java函数是传值的,java函数传递的参数是对象的引用”。我看到过几个解释这个问题的例子,不过个人感觉看过例子之后还是只知道是什么不知道为什么,停留在照猫画虎的水平上还是挺容易出问题的。所以举例子之前,先从jvm的实现原理上有个了解应当是不无裨益的。jvm的结构图可以从《深入java虚拟机》这本巨牛的书上找到,绝对有权威性。从jvm的结构图上可 阅读全文
posted @ 2012-04-01 00:51 xwdreamer 阅读(3573) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示