2011年10月28日
摘要: 转自:zhedahht.blog.163.com/blog/static/25411174200712895228171/ 题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小. 阅读全文
posted @ 2011-10-28 22:04 白草黒尖 阅读(1138) 评论(0) 推荐(0) 编辑
摘要: 转自:http://zhedahht.blog.163.com/blog/static/254111742007228357325/ 题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。 例如输入整数22和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径:10, 12和10, 5, 7。 二元树结点的数据结构定义为:struct BinaryTreeNode // a node in the binary tree{ int m_nValue; //... 阅读全文
posted @ 2011-10-28 21:45 白草黒尖 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 转自:http://zhedahht.blog.163.com/blog/static/2541117420072432136859/ 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个数就是最小的k个数。只是这种思路的时间复杂度为O(nlogn)。我们试着寻找更快的解决思路。 我们可以先创建一个大小为k的数据容器来存储最小的k个数字。接下来我们每次从输入的n个整数中读入一个数。如果容器中已有的数字少于k个,则直接把这次读入的整数放入容器之中;. 阅读全文
posted @ 2011-10-28 19:32 白草黒尖 阅读(840) 评论(0) 推荐(0) 编辑
摘要: 转自:http://zhedahht.blog.163.com/blog/static/2541117420072250322938/ 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。 分析:本题就是有名的约瑟夫环问题。既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数字的环形列表,然后每次从这个列表中.. 阅读全文
posted @ 2011-10-28 19:16 白草黒尖 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 转自:http://zhedahht.blog.163.com/blog/static/25411174200722710364233/ 题目:下面是一个数组类的声明与实现。请分析这个类有什么问题,并针对存在的问题提出几种解决方案。template<typename T> class Array{public: Array(unsigned arraySize):data(0), size(arraySize) { if(size > 0) data = new T[size]; } ~Array() { ... 阅读全文
posted @ 2011-10-28 18:42 白草黒尖 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 转自:http://zhedahht.blog.163.com/blog/static/25411174200722991933440/ 题目:定义Fibonacci数列如下: /0n=0 f(n)= 1n=1 \f(n-1)+f(n-2)n=2 输入n,用最快的方法求该数列的第n项。 分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。因此很多程序员对这道题的递归解法非常熟悉,看到题目就能写出如下的递归求解的代码。long long Fibonacci_Solution1(unsigned int n){ int result[2] = {0,... 阅读全文
posted @ 2011-10-28 17:08 白草黒尖 阅读(222) 评论(1) 推荐(0) 编辑
摘要: 转自:http://zhedahht.blog.163.com/blog/static/254111742007376431815/ 题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。 分析:求最长公共子串(Longest Common Subsequence, . 阅读全文
posted @ 2011-10-28 16:47 白草黒尖 阅读(205) 评论(0) 推荐(1) 编辑
摘要: 转自:http://zhedahht.blog.163.com/blog/static/25411174200732711051101/ 题目:输入一个正数n,输出所有和为n连续正数序列。 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。 分析:这是网易的一道面试题。 这道题和本面试题系列的第10题有些类似。我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于n的话,我们向右移动small,相当于从序列中去掉较小的数字。如果从small到bi. 阅读全文
posted @ 2011-10-28 12:24 白草黒尖 阅读(202) 评论(0) 推荐(0) 编辑