data structure, algorithm, etc.
【整理】二分查找延伸
摘要:找出一个有序字符串数组arr中值等于字符串v的元素的序号,如果有多个元素满足这个条件,返回其中序号最大的? 类似:在有序整数数组中查找指定数值,若有多个元素满足这个条件,返回其中序号最小的?#include <iostream>using namespace std;int binary_search(int *arr, int len, int key){ if (arr == NULL || len <= 0) return -1; int minIndex = 0, maxIndex = len-1, midIndex; // 循环结束有2种情况:若mi...
阅读全文
posted @
2011-11-03 19:47
白草黒尖
阅读(318)
推荐(0)
【整理】最少完全平方数
摘要:费马四平方数猜想指出,任意自然数都可以分解成不超过四个完全平方数的和,eg:144 = 122 ,14 = 12 + 22 + 32 现在给出自然数N(N ≤ 60000),希望知道N最少可以分解成多少个完全平方数。 思路(动态规划):(1) 第一次循环找出本身为完全平方数的那些数,标记为 1; (2) 第二个循环把由两个平方数之和,三个平方数之和的那些数标记为 2 、3,没标记那部分由 4 个平方数组成#include <iostream>using namespace std;int main(){ const int arr_size = 60001; int s[arr_.
阅读全文
posted @
2011-11-01 22:27
白草黒尖
阅读(1128)
推荐(0)
【整理】Bit-map/Bloom-filter
摘要:Bit-map:用一个bit位来标记某个元素对应的Value, 而Key即是该元素,由于采用了Bit为单位来存储数据,在存储空间方面可以大大节省。 假设要对0-7内的5个元素(4,7,2,5,3)排序(假设没有重复),就可采用Bit-map的方法来达到排序的目的。要表示8个数,只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0(如下图:) 然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)) ,当然了这里的操作涉及到Big-ending和Little-end
阅读全文
posted @
2011-10-30 22:38
白草黒尖
阅读(1549)
推荐(0)
【转帖】设计包含min函数的栈
摘要:转自:zhedahht.blog.163.com/blog/static/25411174200712895228171/ 题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。分析:这是去年google的一道面试题。我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序。这样栈顶元素将是最小元素。但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了。在栈里添加一个成员变量存放最小元素(或最小元素的位置)。每次push一个新元素进栈的时候,如果该元素比当前的最小.
阅读全文
posted @
2011-10-28 22:04
白草黒尖
阅读(1149)
推荐(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
白草黒尖
阅读(253)
推荐(0)
【转帖】查找最小的k个元素(最大堆)
摘要:转自: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
白草黒尖
阅读(878)
推荐(0)
【转帖】圆圈中最后剩下的数字
摘要:转自:http://zhedahht.blog.163.com/blog/static/2541117420072250322938/ 题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。 分析:本题就是有名的约瑟夫环问题。既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数字的环形列表,然后每次从这个列表中..
阅读全文
posted @
2011-10-28 19:16
白草黒尖
阅读(317)
推荐(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
白草黒尖
阅读(185)
推荐(0)
【转帖】O(logn)求Fibonacci数列
摘要:转自: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
白草黒尖
阅读(230)
推荐(0)
【转帖】最长公共子序列
摘要:转自:http://zhedahht.blog.163.com/blog/static/254111742007376431815/ 题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。 分析:求最长公共子串(Longest Common Subsequence, .
阅读全文
posted @
2011-10-28 16:47
白草黒尖
阅读(217)
推荐(1)
【转帖】和为n连续正数序列
摘要:转自: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
白草黒尖
阅读(210)
推荐(0)
【转帖】从尾到头输出链表
摘要:转自:http://zhedahht.blog.163.com/blog/static/2541117420079237185699/ 题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode { int m_nKey; ListNode* m_pNext;}; 分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。 看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的指针反转过来,改变链表的方向。然后就可以从头到尾输出了。反转链表的算法详见本人面试题...
阅读全文
posted @
2011-10-27 23:39
白草黒尖
阅读(264)
推荐(0)
【转帖】找出数组中两个只出现一次的数字
摘要:转自:http://zhedahht.blog.163.com/blog/static/2541117420071128950682/ 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 分析:这是一道很新颖的关于位运算的面试题。 首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。 这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0。也就是说,如.
阅读全文
posted @
2011-10-27 22:50
白草黒尖
阅读(207)
推荐(0)
【转帖】寻找丑数
摘要:转自:http://zhedahht.blog.163.com/blog/static/2541117420094245366965/ 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。 分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。 所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数只能被2、3和5整除。也就是说如果一个数如果它能被2整除,我们把它连续除以2;如果能被3整除,.
阅读全文
posted @
2011-10-27 22:12
白草黒尖
阅读(211)
推荐(0)
【转帖】输出1到最大的N位数
摘要:转自:http://zhedahht.blog.163.com/blog/static/2541117420094279426862/ 题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。 分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。应聘者在解决这个问题的时候,最容易想到的方法是先求出最大的n位数是什么,然后用一个循环从1开始逐个输出。很快,我们就能写出如下代码:// Print numbers from 1 to the maximum number with n digits, in ordervoid P.
阅读全文
posted @
2011-10-27 19:32
白草黒尖
阅读(1011)
推荐(0)
【转帖】颠倒栈
摘要:转自:http://zhedahht.blog.163.com/blog/static/25411174200943182411790/ 题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。 分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过来了。颠倒一个数组是一件很容易的事情。不过这种思路需要显示分配一个长度为O(n)的数组,而且也没有充分利用递归的特性。 我们再来考虑怎么递归。我们把栈{1, .
阅读全文
posted @
2011-10-27 16:50
白草黒尖
阅读(282)
推荐(1)
【转帖】扑克牌的顺子
摘要:转自:http://zhedahht.blog.163.com/blog/static/25411174200951262930831/ 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 分析:这题目很有意思,是一个典型的寓教于乐的题目。我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。 接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值.
阅读全文
posted @
2011-10-27 16:37
白草黒尖
阅读(509)
推荐(1)
【转帖】把数组排成最小的数
摘要:转自:http://zhedahht.blog.163.com/blog/static/25411174200952174133707/ 题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 分析:这是09年6月份百度新鲜出炉的一道面试题,从这道题我们可以看出百度对应聘者在算法方面有很高的要求。 这道题其实是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。要确定排序规则,就得比较两个数字,也就是给出两个数字m和n,我们需要确定.
阅读全文
posted @
2011-10-27 16:16
白草黒尖
阅读(1802)
推荐(0)
【转帖】旋转数组的最小元素
摘要:转自:http://zhedahht.blog.163.com/blog/static/25411174200952765120546/ 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面.
阅读全文
posted @
2011-10-27 15:59
白草黒尖
阅读(311)
推荐(0)
【转帖】n个骰子的点数
摘要:转自:http://zhedahht.blog.163.com/blog/static/254111742009101524946359/ 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。 分析:玩过麻将的都知道,骰子一共6个面,每个面上都有一个点数,对应的数字是1到 6之间的一个数字。所以,n个骰子的点数和的最小值为n,最大值为6n。因此,一个直观的思路就是定义一个长度为6n-n的数组,和为S的点数出现的次数保存到数组第S-n个元素里。另外,我们还知道n个骰子的所有点数的排列数6^n。一旦我们统计出每一点数出现的次数之后,因此只要把每一点.
阅读全文
posted @
2011-10-27 15:27
白草黒尖
阅读(1751)
推荐(0)