2009年8月4日

摘要: 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。 分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数只能被2、3和5整除。也就是说如果... 阅读全文
posted @ 2009-08-04 14:45 两颗番茄 阅读(10234) 评论(2) 推荐(6) 编辑
 
摘要: 题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。分析:这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。现在我们再来讨论一般情... 阅读全文
posted @ 2009-08-04 14:43 两颗番茄 阅读(1230) 评论(1) 推荐(2) 编辑
 
摘要: 题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。现在的问题变成怎样判断... 阅读全文
posted @ 2009-08-04 14:39 两颗番茄 阅读(1914) 评论(2) 推荐(1) 编辑
 
摘要: 题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我们可以新开辟一块长度为n+1的辅助空间... 阅读全文
posted @ 2009-08-04 14:39 两颗番茄 阅读(937) 评论(0) 推荐(0) 编辑
 
摘要: 题目:下面是一个数组类的声明与实现。请分析这个类有什么问题,并针对存在的问题提出几种解决方案。template<typename T> class Array{public: Array(unsigned arraySize):data(0), size(arraySize) { if(size > 0) data = new T[size]; } ~Array() { if(d... 阅读全文
posted @ 2009-08-04 14:38 两颗番茄 阅读(700) 评论(0) 推荐(0) 编辑
 
摘要: 题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / \ 6 10/\ /\5 7 9 11输出8 6 10 5 7 9 11。分析:这曾是微软的一道面试题。这道题实质上是要求遍历一棵二元树,只不过不是我们熟悉的前序、中序或者后序遍历。我们从树的根结点开始分析。自然先应该打印根结点8,同时为了下次能够打印8的两个子结点,我们应该在遍历到8时把子结点... 阅读全文
posted @ 2009-08-04 14:37 两颗番茄 阅读(675) 评论(0) 推荐(1) 编辑
 
摘要: 题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(... 阅读全文
posted @ 2009-08-04 14:36 两颗番茄 阅读(705) 评论(0) 推荐(0) 编辑
 
摘要: 题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。... 阅读全文
posted @ 2009-08-04 14:35 两颗番茄 阅读(1681) 评论(0) 推荐(0) 编辑
 
摘要: 题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,它们的m_pNext都指向同一个结点。但由于是单向链表的结点,每个结点只有... 阅读全文
posted @ 2009-08-04 14:34 两颗番茄 阅读(1163) 评论(0) 推荐(0) 编辑
 
摘要: 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或... 阅读全文
posted @ 2009-08-04 14:33 两颗番茄 阅读(2000) 评论(1) 推荐(0) 编辑
 
摘要: 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之... 阅读全文
posted @ 2009-08-04 14:27 两颗番茄 阅读(1105) 评论(0) 推荐(0) 编辑
 
摘要: 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。分析:如果我们不考虑时间复杂度,最简单想法的莫过去先在数组中固定一个数字,再依次判断数组中剩下的n-1个数字与它的和是不是等于输入的... 阅读全文
posted @ 2009-08-04 14:26 两颗番茄 阅读(1258) 评论(0) 推荐(0) 编辑
 
摘要: 题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。既然不能从尾结点开始遍历... 阅读全文
posted @ 2009-08-04 14:25 两颗番茄 阅读(855) 评论(0) 推荐(0) 编辑
 
摘要: 题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。通常求1+2+…+n除了用公式n(n+1)/2之外,无外乎循环和递归两种思路。... 阅读全文
posted @ 2009-08-04 14:24 两颗番茄 阅读(1551) 评论(0) 推荐(0) 编辑
 
摘要: 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。分析:这是一道trilogy的笔试题,主要考查对二... 阅读全文
posted @ 2009-08-04 14:23 两颗番茄 阅读(492) 评论(0) 推荐(0) 编辑
 
摘要: 题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。我们可以开辟一个长度为k的数组。每次从输入的n个整数中读入一个数。如果数组中已经插入的元素少于k个,则将读入的整... 阅读全文
posted @ 2009-08-04 14:22 两颗番茄 阅读(1241) 评论(0) 推荐(0) 编辑
 
摘要: 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。分析:本题最初为2005年浙江大学计算机系的考研题的最后一道程序设计题,在2006年里包括... 阅读全文
posted @ 2009-08-04 14:21 两颗番茄 阅读(1179) 评论(1) 推荐(1) 编辑
 
摘要: 题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);分析:这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察... 阅读全文
posted @ 2009-08-04 14:19 两颗番茄 阅读(1181) 评论(1) 推荐(0) 编辑
 
摘要: 1、U2 合唱团在17 分钟内得赶到演唱会场,途中必需跨过一座桥,四个人从桥的同一端出发, 你得帮助他们到达另一端,天色很暗,而他们只有一只手电筒。一次同时最多可以有两人一起过桥,而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同,若两人同行则以较慢者 的速度为准。Bono 需花1 分钟过桥,Edge 需花2 分钟过桥,Ad... 阅读全文
posted @ 2009-08-04 13:58 两颗番茄 阅读(3095) 评论(0) 推荐(0) 编辑
 
摘要: 0、数组原地逆置 很很很简单(不附加任何空间)int reverse(int *array){for(int i=0;i<MAX/2;i++){array[i]=array[i]+array[MAX-1-i];array[MAX-1-i]=array[i]-array[MAX-1-i];array[i]=array[i]-array[MAX-1-i];}return 0;}1、将一整数逆序后... 阅读全文
posted @ 2009-08-04 13:56 两颗番茄 阅读(1665) 评论(0) 推荐(1) 编辑