随笔分类 -  面试题

摘要:题目:求字符串的最长非重复子序列。比如字符串“dabaccdeff”,它的最长非重复子序列为“dabcef”这道题目与面试题35:第一个只出现一次的字符非常相似。都可以通过对字符串球哈希来解。View Code #include<iostream>#include <stack> #include<stdlib.h>using namespace std;void print(char *s,int len,char *hashtable);int NoReplicatedSubstring(char *s,int len){ const int table 阅读全文
posted @ 2012-10-13 16:20 xwdreamer 阅读(2491) 评论(0) 推荐(1) 编辑
摘要:题目:输入一棵二叉树的根节点,求该树的深度。从根节点到叶子结点一次经过的结点形成树的一条路径,最长路径的长度为树的深度。根节点的深度为1。解体思路:如果根节点为空,则深度为0,返回0,递归的出口如果根节点不为空,那么深度至少为1,然后我们求他们左右子树的深度,比较左右子树深度值,返回较大的那一个通过递归调用代码实现View Code #include<iostream>#include<stdlib.h>using namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; Bi 阅读全文
posted @ 2012-10-13 14:44 xwdreamer 阅读(25049) 评论(2) 推荐(0) 编辑
摘要:题目:求一个数的质因数分解,比如输入90,输出2*3*3*5。解体思路:要求一个数n的质因数分解,首先求出n以内的所有质数,将其放入prime[]数组内,然后再让prime[i]去除n,如果能够整除,那么这个prime[i]就是n的质因数,否则不是。求prime[]的方法是筛法求素数。代码实现View Code #include<iostream>#include<stdlib.h>using namespace std;bool isPrime(int number);//判断number是否为素数void PrintPrime(int number);//查找0.. 阅读全文
posted @ 2012-10-13 13:49 xwdreamer 阅读(2263) 评论(7) 推荐(2) 编辑
摘要:题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i<j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。参考文献排序算法汇总->归并排序解题思路看到这样的题目,最简单的想法就是遍历每一个元素,让其与后面的元素对比,如果大于则count++,但是这样的时间复杂度是o(n2)。这题有更好的解 阅读全文
posted @ 2012-10-12 21:46 xwdreamer 阅读(15717) 评论(0) 推荐(0) 编辑
摘要:题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。方法1:看到这个题目,最直观的想法就是就是遍历法,也就是从头开始取字符串中的一个字符,将其与其后的所有字符比较,如果有相同的字符,那么就证明它不是只出现一次的字符。当第一次出现遍历完其后字符并且没有重复时,表明这个字符就是“第一个只出现一次的字符”。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n2)。方法2:题目中要求第一个只出现一次的字符,那么就跟字符出现的次数有关。我们考虑如何统计字符出现的次数,然后找出第一个次数为1的那个字符。这里我们需要一个数据容器 阅读全文
posted @ 2012-09-26 12:03 xwdreamer 阅读(12267) 评论(3) 推荐(0) 编辑
摘要:题目:我们把只包含因子2,3和5的数称作为丑数。求按从小到大的顺序的第1500个丑数。例如6,8都是丑数,但是14不是,因为它包含因子7。习惯上我们把1作为第一个丑数。方法一:遍历法使用遍历法求第k个丑数,从1开始遍历,如果是丑数则count++,直到count==k为止。那么如何判断丑数呢?根据丑数的定义,丑数只有2,3,5这三个因子,那么我们就拿数字除以这三个因子。具体算法如下:如果一个数能够被2整除,那么让他继续除以2;如果一个数能够被3整除,那么让他继续除以3;如果一个数能够被5整除,那么让他继续除以5;如果最后这个数变为1,那么这个数就是丑数,否则不是。代码实现如下:View Cod 阅读全文
posted @ 2012-09-25 10:52 xwdreamer 阅读(7792) 评论(0) 推荐(4) 编辑
摘要:参考文献http://hi.baidu.com/zdfgng/blog/item/dd5f88359a1cd0260b55a9ce.html题目假如要查询在a表中存在,但是在b表中不存在的记录,应该如何查询。为了便于说明,我们假设a表和b表都只有一个字段id,a表中的记录为{1,2,3,4,5},b表中的记录为{2,4},那么我们需要通过一个sql查询得到{1,3,5}这样的结果集。一般解法(效率低)看到这个题目,我们首先想到的可能就是not in这样的关键字,具体的查询语句如下:select ta.* from ta where ta.id not in(select tb.id from 阅读全文
posted @ 2012-06-01 13:29 xwdreamer 阅读(24327) 评论(3) 推荐(6) 编辑
摘要:待补充题目:一个数组中只有0,1,2三种元素,要求对这样的数组进行排序。1.思路:1.1思路1: 第一眼看到这样的题目,会举得非常简单,只需要两次遍历数组就可以完成了。第一次遍历,扫描数组中的元素,每次遇到0则count0++,遇到1则count1++,遇到2则count2++,这样一趟下来就能够统计出数组中0,1,2的个数了。然后第二次遍历的时候,只需要对数组进行重新赋值就可以了,从头开始赋值count0个0,count1个1,count2个2。最终完成对数组的排序。1.2思路2: 既然是面试题,那么肯定不会让你这么简单就解决出来了的。面试官说,加入只能进行一次遍历怎么办,然后你就不知道.. 阅读全文
posted @ 2012-05-17 13:08 xwdreamer 阅读(2998) 评论(3) 推荐(0) 编辑
摘要:0.参考文献:http://jacki6.iteye.com/blog/774866http://baike.baidu.com/view/402020.htm1.范式说明1.1第一范式(1NF)无重复的列 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能同时有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。 在任何一个关系数据库中,第一范式(1NF)是对.. 阅读全文
posted @ 2012-05-17 13:07 xwdreamer 阅读(16703) 评论(4) 推荐(9) 编辑
摘要:题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大树问题。这道题目有以下几点需要注意:0的0次方是无意义的,非法输入0的负数次方相当于0作为除数,也是无意义的,非法输入base如果非0,如果指数exponent小于0,可以先求base的|exponent|次方,然后再求倒数判断double类型的base是否等于0不能使用==号。因为计算机表述小树(包括float和double型小数)都有误差,不能直接使用等号(==)判断两个小数是否相等。如果两个数的差的绝对值很小,那么可以认为两个dou 阅读全文
posted @ 2012-05-15 22:19 xwdreamer 阅读(3462) 评论(2) 推荐(1) 编辑
摘要:题目1:写一个函数,输入n,其斐波那契数列的第n项。斐波那契数列的定义如下:方法1:使用递归解,时间复杂度是n的指数级别斐波那契数列的定义就是递归的,我们根据定义可以很简单的写出代码。代码如下:View Code #include<iostream>#include<stdlib.h>using namespace std;//f(n)={0,1,1,2,3...} n>=0int Fibonacci(int n){ if(n<=0) return 0; if(n==1) return 1; return Fibonacci(n-1)+Fibona... 阅读全文
posted @ 2012-05-15 14:58 xwdreamer 阅读(5810) 评论(0) 推荐(1) 编辑
摘要:题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public:CMyString(char *pData=NULL);//构造函数CMyString(const CMyString& str);//拷贝构造函数~CMyString();//析构函数private:char* m_pData;//数据域,字符指针};介绍重载赋值 重载操作符是一些函数,其名字为关键字operator后紧跟需要重载的运算符,比如"operator="表示需要重载"="。像任何其他函数一样,操作符函数有一个返回值和 阅读全文
posted @ 2012-05-14 21:58 xwdreamer 阅读(5707) 评论(2) 推荐(5) 编辑
摘要:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前一个日志文件中有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门),请你统计最热门的10个查询串,要求使用的内存不能超过1G。1000万条记录,每条记录最大为255Byte,那么日志文件最大有2.5G左右,大于1G内存。但是题目中又提到这样的1000万条记录中有许多是重复的,出去重复的话只有300万条记录,存储这样的300万条记录需要0.75G左右的内存,小于1G内存。那么我们可以考虑将这 阅读全文
posted @ 2012-05-09 21:29 xwdreamer 阅读(2012) 评论(0) 推荐(1) 编辑
摘要:前言这道题目网上到处都是,但是好多都没有讲清楚,然后大家又相互转载,错误泛滥,现在我来完善这道题目。题目:每一个ip访问百度,其ip地址都会被记录到后台日志文件中,假设一天的访问日志有100G,求出一天中访问百度次数最多的ip地址,可以使用的内存大小是1G。分析首先解决大文件问题,也就是如何处理100G的一个大文件,这个通常的解决方法就是将大文件分解成许多小文件。我们可以通过对IP地址求hash然后对1024取模将一个100G的大文件分解成1024个小文件(file0,file1......file1023),注意这里的1024个文件并不是平均分的,也就是每个文件大小并不是(100G/1204 阅读全文
posted @ 2012-05-09 20:29 xwdreamer 阅读(5713) 评论(6) 推荐(1) 编辑
摘要:题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'<'运算符的。分析代码实例:View Code #include<iostream>#include<stdlib.h>#include<stack>using namespace std;void MergeSort(int arry[],int len){ int left=0; int mid=len/2; int 阅读全文
posted @ 2012-05-08 16:42 xwdreamer 阅读(1834) 评论(0) 推荐(0) 编辑
摘要:1.替换空格题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。1.1分析将长度为1的空格替换为长度为3的“%20”,字符差的产度变长。如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。但是如果面试官要求在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。如果从前往后替换字符串,那么保存在空格后面的字符串肯定会 阅读全文
posted @ 2012-05-08 14:20 xwdreamer 阅读(2335) 评论(1) 推荐(0) 编辑
摘要:题目:输入n个整数,找出其中最小的k个数。例如输入{4,5,1,6,2,7,3,8}这8个数字,则最小的4个数字是1,2,3,4。分析这道题目跟上一道:面试题29:数组中出现次数超过一半的数字类似,都是通过Partition()的思路来解题。通过Partition()获得index,判断index==k,如果等于k,那么表明在index左边的k个数都小于index所指向的数,并且也小于index右边的数。那么就找出了本题所要求的最小的k个数。如果index>k,则第k小的数在[start,index-1]之间,如果index<k,则第k小的数在[index+1,end]之间。知道最 阅读全文
posted @ 2012-05-08 11:00 xwdreamer 阅读(927) 评论(0) 推荐(0) 编辑
摘要:题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。分析:如果一个数字才数组中出现的次数超过了数组长度的一半,那么对这个数组进行排序,位于数组中间位置的那个数就是出现次数超过一半的那个数。对数组排序的时间复杂度是O(nlog(n)),但是对于这道题目,还有更好的算法,能够在时间复杂度O(n)内求出。我们写过快速排序算法,其中的Partition()方法是一个最重要的方法,该方法返回一个index,能够保证index位置的数是已排序完成的,在index左 阅读全文
posted @ 2012-05-08 10:53 xwdreamer 阅读(2567) 评论(0) 推荐(0) 编辑
摘要:题目:一个数组是由一个递增数列右移若干位形成的,比如{4,5,1,2,3}是由{1,2,3,4,5}左移两位形成的,在这种数组中查找某一个数。这道题其实是前面介绍的一道题目:面试题8:旋转数组的最小数字的一个变种。解题思路如下:首先通过“面试题8:旋转数组的最小数字”这道题目中获取元素分裂点,时间复杂度为O(log(n))因为旋转数组是由递增数组右移得到,因此旋转数组中的第一个元素是整个数组的中间元素,比较待查找元素与第一个元素,如果待查找元素大于等于第一个元素,表明待查找元素在前半段有序数组中;如果不是这待查找元素在后半段数组中。判断待查找元素所在的有序数组以后,我们通过一个简单的二分查找就 阅读全文
posted @ 2012-05-07 19:09 xwdreamer 阅读(5114) 评论(0) 推荐(0) 编辑
摘要:题目总结面试总结排序算法汇总1.快排快速排序算法QuickSort快速排序算法QuickSort(二)面试题29:数组中出现次数超过一半的数字面试题30:最小的k个数2.二分查找二分查找算法面试题8:旋转数组的最小数字面试题:查找旋转数组中的某一元素3.链表面试题5:从尾到头打印链表面试题13:在O(1)时间删除链表结点面试题16:反转链表面试题15:链表中倒数第K个结点面试题27:二叉搜索树与双向链表4.二叉树面试题27:二叉搜索树与双向链表二叉搜索树的插入与删除5.字符串/数组/指针面试题28:字符串的排列面试题4:替换空格和清除空格面试题31:连续子数组的最大和数组指针、指针数组以及二位 阅读全文
posted @ 2012-05-07 18:43 xwdreamer 阅读(46) 评论(0) 推荐(0) 编辑