随笔分类 -  面试题

摘要:题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。例如输入{1,2,3,4,5}的一个旋转为{3,4,5,1,2},该数组的最小值为1。分析最直观的想法就是顺序遍历一次数组,就能够找出最小的数字,这样的时间复杂度是O(n),当时我也是这么跟面试官说的,我说遍历一次不就OK了吗?面试官说“如果你觉得遍历一次是你觉得最好的,那就跟我说!”我立马说不是的,让我想想,应该还有其他更有的方法。是的,既然叫做旋转数组,那么我们就需要利用好旋转数组的特性。看到这样的旋转数组查找最小数,我们会不会潜意识里面就想到了二分查找呢。确 阅读全文
posted @ 2012-05-07 15:41 xwdreamer 阅读(4730) 评论(4) 推荐(1)
摘要:参考文献:http://blog.minidx.com/2008/02/03/468.html正文在面试的时候二分查找是用的比较多一种查找算法,如何在面试官面前快速准确得的写出代码决定你是否能够被录取。以前一直以为二分查找很简单,所以就没怎么重视,但是真要在面试官面前对着黑板手写出来,还是漏洞百出。今天自己在电脑面前敲出了二分查找的代码,也花了将近半个小时。对于这种基础排序查找算法,还是得好好重视。二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。二分查找的主要思路就是设定两个指针start和end 阅读全文
posted @ 2012-05-07 13:24 xwdreamer 阅读(23662) 评论(6) 推荐(6)
摘要:参考文献:http://blog.csdn.net/bocaicbl/article/details/5319915Java深度历险(四)——Java垃圾回收机制与引用类型JVM概念之Java对象的大小与引用类型1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。 垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用.. 阅读全文
posted @ 2012-05-06 00:45 xwdreamer 阅读(1929) 评论(0) 推荐(1)
摘要:题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。看到这个题目,我们首先想到的是求出这个整型数组所有连续子数组的和,长度为n的数组一共有 n(n+2)/2个子数组,因此要求出这些连续子数组的和最快也需要O(n^2)的时间复杂度。但是题目要求的O(n)的时间复杂度,因此上述思路不能解决问题。看到O(n)时间复杂度,我们就应该能够想到我们只能对整个数组进行一次扫描,在扫描过程中求出最大连续子序列和以及子序列的起点和终点位置。假如输入数组为{1,-2,3,10,-4,7,2,-5},我们尝试从头到尾累加其中的正 阅读全文
posted @ 2012-05-04 12:25 xwdreamer 阅读(10618) 评论(3) 推荐(0)
摘要:题目:有两个相同的栈A和B,在栈A中存放着从大到小的数:1,2,3,4,5,栈顶为最小数1,另外一个栈B为空的。现在要求不使用其他的数据结构,将栈A中的数字顺序倒过来,使其栈顶的数为最大值5。解题思路:这道题目有一个非常直观的思路。首先栈A中存放着1,2,3,4,5这样5个数字,栈顶元素为1,我们需要将其倒序为5,4,3,2,1。我们首先需要将栈顶的最小值1取出来存放在临时变量temp中,然后将剩下的四个数字2,3,4,5转移到栈B中去,再将刚才存放在临时变量中的1插入到栈A中,最后将栈B中的数字转移回到栈A,此时栈A中有一个书是排序好的,就是栈底的1。重复上面的思路,这回我们取出栈顶的最小值 阅读全文
posted @ 2012-05-03 22:22 xwdreamer 阅读(2314) 评论(0) 推荐(0)
摘要:题目:用两个栈实现一个队列。队列的生命如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。template <typename T>class CQueue{public: CQueue(void); ~CQueue(void); void appendtail(const T& node); T deleteHead();private: stack<T> stack1; stack<T> stack2;};解题思路:插入操作在stack1中进行,删除操作在stack2中进行,如 阅读全文
posted @ 2012-05-03 15:17 xwdreamer 阅读(10618) 评论(0) 推荐(1)
摘要:题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中左边儿茶搜索树,则输出转换后的排序双向链表。 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 阅读(4398) 评论(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 阅读(1082) 评论(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 阅读(4810) 评论(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 阅读(13584) 评论(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 阅读(4278) 评论(0) 推荐(0)
摘要:题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。我们知道链表的特性,查找其中某一个结点的时间复杂度是O(n),不像数组那样可以直接通过下表在O(1)的时间内查找到指定元素。因此如果要查找链表元素,我们必须从头结点开始顺序往后查找。现在需要输出链表中的每个结点的值,而必须是从尾到头的,也就是先遍历的结点后输出,一个典型的“先进后出”的数据结构,这就让我们想到了栈的结构,如果我们在遍历链表的时候,将遍历的结果存放在一个栈中,遍历结束以后输出栈中的元素值,就是我们需要的从尾到头打印链表结点值。下面给出代码实例,在代码实例中还包括了创建单链表结点的方法CreateListNode(),往 阅读全文
posted @ 2012-04-26 20:05 xwdreamer 阅读(3204) 评论(0) 推荐(0)
摘要:1.排序算法简要比较名称数据对象稳定性时间复杂度空间复杂度描述平均最坏插入排序数组、链表√O(1)(有序区,无序区)。把无序区的第一个元素插入到有序区的合适的位置。对数组:比较得少,换得多。直接选择排序数组×O(1)(有序区,无序区)。在无序区里找一个最小的元素跟在有序区的后面。 对数组:比较得多,换得少。链表√堆排序数组×O(nlogn)O(1)(最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。归并排序数组、链表√O(nlogn)O(n) +O(logn) , 如果不是从下到上把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行 阅读全文
posted @ 2012-04-06 19:06 xwdreamer 阅读(4447) 评论(0) 推荐(0)
摘要: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 阅读(47023) 评论(10) 推荐(25)
摘要:参考文献:C++中构造函数与析构函数的调用顺序1.形参与实参形参:是函数声明时的参数,只说明参数名和类型,不是实际的参数,不能真正使用。实参:运行时传给函数的参数,是实际的变量,形参在这时真正被分配空间,并复制了实参的值。一个函数的实参在内存中有自己固定的内存,直到函数执行结束才释放内存。而形参没有固定的内存,只在调用函数的时候有一个虚拟内存,等调用完毕就不再有内存。。他们的关系是在函数调用的时候,实参把值传给形参。2.构造函数构造函数不能有返回值,函数名为类名。缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空。缺省构造函数是不带参数的。创建 阅读全文
posted @ 2012-04-01 09:58 xwdreamer 阅读(4650) 评论(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 阅读(3579) 评论(0) 推荐(0)
摘要:1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。首先我们定义的二元查找树 节点的数据结构如下:struct BSTreeNode{ int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node};2.设计包含min函数的 阅读全文
posted @ 2011-12-13 14:19 xwdreamer 阅读(69190) 评论(3) 推荐(2)
摘要:题目:http://fayaa.com/tiku/view/109/————————————————————————————————————————————————一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现;0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻注意:5个数值允许是乱序的。比如: 8 7 5 0 60可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者40可以多次出现。复杂度如果是O(n2)则不得分。——————————————————————————————————————————— 阅读全文
posted @ 2011-07-04 09:47 xwdreamer 阅读(1277) 评论(0) 推荐(0)
摘要:1.说明这个快速排序算法是对前面的快速排序算法QuickSort一种改进。只是修改了int Partition(int arry[],int start,int end)这个方法。2.思路仔细观察我们可以发现,我们前面Partition方法中,都需要swap(arry,start,end),但是这一步中有些步骤是可以省略的。在(<-end)过程中,碰到第一个小于等于pivot的元素时,只需要进行一次赋值arry[start]=arry[end];因为当前的arry[start]是值就是pivot;在(start->)过程中,碰到第一个大于等于pivot的元素之,只需要进行一次赋值a 阅读全文
posted @ 2011-06-16 01:59 xwdreamer 阅读(987) 评论(0) 推荐(0)
摘要:SQL-92标准中定义了四个隔离级别,这四个隔离级别在以前版本的SQL Server中即受到支持:READ UNCOMMITTEDREAD UNCOMMITTED是限制性最弱的隔离级别,因为该级别忽略其他事务放置的锁。使用READ UNCOMMITTED级别执行的事务,可以读取尚未由其他事务提交的修改后的数据值,这些行为称为“脏”读。这是因为在Read Uncommitted级别下,读取数据不需要加S锁,这样就不会跟被修改的数据上的X锁冲突。比如,事务1修改一行,事务2在事务1提交之前读取了这一行。如果事务1回滚,事务2就读取了一行没有提交的数据,这样的数据我们认为是不存在的。READ COM 阅读全文
posted @ 2011-01-18 00:19 xwdreamer 阅读(10213) 评论(2) 推荐(5)