- 博客(25)
- 收藏
- 关注
原创 动态规划解最长公共子序列问题
动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。 为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】 求两字符序列的最长公共字符子序列 问
2009-05-30 21:28:00 186116 62
原创 面试题精选(73):求内积最大的字数组
据说这是一道Google的面试题。在网上看到有些人在讨论这道题目,但能给出正确算法的人并不多。问题描述:有两个长度均为n的整数数组A和B,现在要从这两个数组中各抽出s个数字,分别构成两个新的数组C和D,要求数组C和D的内积最大。即已知:A=[a1,a2,...,an],B=[b1,b2,...,bn];求:C=[c1,c2,...,c5],D=[d1,d2,...,d5];满足:c1,..
2009-05-30 15:40:00 4184 1
原创 算法导论之堆排序(堆排序、n*lgk 归并、杨氏矩阵)
堆排序实现:#define LEFT(i) (2*i)#define RIGHT(i) (2*i+1)#define PARENT(i) (i/2)template void heap_print(T seq[],int n){ int h=floor(log(double(n))/log(2.))+1; for(int i=1;i { for(int j=
2009-05-29 22:49:00 2578 1
原创 面试题精选(72):设计含min函数的队列
题目描述:设计一FIFO的队列,要求包含min函数,而且其push_back(),pop_front(),get_min()操作的时间复杂度为O(1),空间复杂度为O(n)。 思路:暂时没有想出完美的解法,但思路可参见“程序员面试题精选(2):设计包含min函数的栈”http://blog.csdn.net/yysdsyl/archive/2007/10/24/1841644.
2009-05-28 21:02:00 1623
原创 几类面试题的思考与总结
1、从N个数里选最XX的K个这个问题是问得最多的。一般情况下K会远小于N。这道题有两个思路,一是参照快速排序的思想,递归地划分,直至找到左边的K个。快排在最坏的情况下,是会退化为平方的,所以要加上随机化。即使不随机化,也有些比较复杂的算法保证复杂度不会很高,可以参照《算法导论》里求第K大的数的算法。如果答出这个算法,估计面试官都佩服你。另一个思路,则比较保险,维护一个堆,里面存K个数,考察下一
2009-05-28 02:28:00 1803
原创 面试题精选(71):倒水倒油类算法
题目描述:一个桶中有12斤油,要求倒出6斤,可现在另外只有两个桶,分别可装8斤与5斤,请问应如何来倒? 思路:广度优先搜索 c#代码: private void button5_Click(object sender, EventArgs e) { //初始状态和结束状态 int[] b
2009-05-27 22:35:00 2323
原创 面试题精选(70):100人民币问题
题目描述:用1元,2元,5元,10元,20元和50元的纸币组成100元,共有多少种情况。 要求输出总方案数和每种方案中各纸币的个数。 ////////////////////////////4562种 代码:背包解法: #include using namespace std;#define N 6int w[N];int number_used[N];//bo
2009-05-25 20:17:00 2006
原创 面试题精选(69):求最大重叠区间大小
题目描述:请编写程序,找出下面 “ 输入数据及格式 ” 中所描述的输入数据文件中最大重叠区间的大小。 对一个正整数 n ,如果 n 在数据文件中某行的两个正整数(假设为 A 和 B )之间,即 A =n>=B ,则 n 属于该行;如果 n 同时属于行 i 和 j ,则 i 和 j 有重叠区间;重叠区间的大小是同时属于行 i 和 j 的整数个数。 例如,行( 10 20 )和( 12 25 )的重叠
2009-05-25 19:11:00 3345 1
原创 临近数求解
[问题描述] 问题1. 计算正数num1的上临近数num2,num2满足: (1) num2 > num1; (2) num1、num2各位数字之和相等(十进制表示); (3) num2是满足(1)、(2)条件的最小正数 问题2. (另一个相似问题) 计算正数num1的下临近数num2,num2满足(注意一个数的下临近数可能
2009-05-23 19:23:00 1714 3
原创 区间模糊排序
问题描述 考虑这样的一种排序问题,即无法准确地知道待排序的各个数字到底是多少。对于其中的每个数字,我们只知道它落在实轴上的某个区间内。亦即,给定的是n个形如[a(i), b(i)]的闭区间(这里小括后起下标的作用,后同),其中a(i) ,使得存在一个c(j)属于区间[a(i(j)), b(i(j))],满足c(1) a) 为n个区间的模糊排序设计一个算法。你的算法应该具有算法的
2009-05-23 17:18:00 1691 2
原创 面试题精选(68):计数排序的原地排序
问题描述 假设n个记录中每一个的关键字都界于1到k之间。说明如何修改计数排序,使得可以在O(n+k)时间内对n个记录原地排序。除输入数组外,可以另用O(k)的存储空间。你给出的算法是稳定的吗? 算法思想 修改基本的计数排序算法,实现原地排序。由于不再使用辅助空间来存放排序结果,因此只能通过对原数组的元素进行置换,以完成排序。由于是使用置换完成排序,因此算法不
2009-05-23 16:53:00 1962
原创 面试题精选(67):1.。。。n中'1'出现的次数
【问题描述】(1)对于一个整数n,写一个函数f(n),使得它返回1到n之间的所有自然数(十进制数表示)中出现的‘1’的次数。例如,对于n=13,自然数1,2,3,4,5,6,7,8,9,10,11,12,13中‘1’出现的次数为6,所以f(13) = 6。(2)找出满足f(n)=n的最大n值。【问题分析】这个问题在《编程之美》中有所讨论,虽然最终给出了正确答案,但解答过程并不严谨。另外,对于第二个
2009-05-23 15:48:00 4117
原创 面试题精选(66):整数的素数和分解问题
【问题描述】歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。对于一个给定的整数,输出所有这种素数和分解式。注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式)。例如,对于整数8,可以作为如下三种分解:(1) 8 = 2 + 2 + 2 + 2(2) 8 =
2009-05-23 15:33:00 1963
原创 面试题精选(65):迷宫最优解的宽度优先解法
【问题描述】有一个用矩阵描述的迷宫,矩阵元素取值0或1(0表示可以进入,1表示不能进入)。现在要找到一条从最左上角到最右下角的最短路径(最左上角和最右下角的矩阵元素均为0)。比如,对于如下4*4矩阵描述的迷宫:0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0,0, 1, 0, 0,0, 0, 0, 0它的最短路径为8(路径上所有位置数),移动方向依次为:右、右、右、下、下、下、
2009-05-23 15:23:00 2155
原创 面试题精选(64):元素可重复组合算法
可重复组合问题是指,在计算(生成)组合时可以允许元素重复的一类组合问题。例如,对于有四个元素的集合{a, b, c, d},其可重复组合C(4, 3)有20个:aaa, aab, aac, aad, abb, abc, abd, acc, acd, add, bbb, bbc, bbd, bcc, bcd, bdd, ccc, ccd, cdd, ddd。用P(n, k)表示从n个元素中选出k个元
2009-05-23 15:01:00 5076 1
原创 面试题精选(63):排列算法
全排列算法有两个比较常见的实现:递归排列和字典序排列。(1)递归实现从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列。算法实现如下:#include #include using namespace std;template void CalcAllPermutation_R(T perm[], int first, int nu
2009-05-23 14:50:00 1365
原创 面试题精选(62):组合算法
计算一个集合的组合,最直观的方式是使用递归:首先选择一个元素,然后在剩下的集合中选择其余元素。代码实现也很简单,下面的代码计算集合的所有可能的组合(一个或多个元素):#include #include #include #include using namespace std;template void CalcCombination(const ElemType elements[], int
2009-05-23 13:21:00 1207
原创 面试题精选(61):打印可能的出栈序列
题目:如何求入栈顺序为1234……N的序列的所有可能的出栈序列? 代码:递归求解 #include #include using namespace std;void print(vector& v){ cout<<endl; for(int i=0;i<(int)v.size();i++) { cout
2009-05-20 14:40:00 2340 2
原创 贪心法解一个数组交集问题
题目:假设有n个数组a[m],(可以看作a[n][m]) a[m]表示一个分成m段的物体的每段的状态, a[m]的元素值为0或1,0表示这段不可用,1表示可用 则a[m]表示的物体可用的部分等于所有1的和, 为s(a[m])=A 求一个公共解b[m], 假定其和为s(b[m])=B 如果a[m]包含b[m],也就是b[m]是a[m]的子集, 则a[m]中的b[m]部分可以使用, 其和等于b[m
2009-05-20 13:49:00 902
原创 微软4道面试题
题目:(1) 一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。 注意: - 5个数值允许是乱序的。比如: 8 7 5 0 6 - 0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4 - 0可以多次出现。 - 复杂度如果是O(n2)则不得分。
2009-05-19 20:56:00 1618 4
原创 位图法应用
一、给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中 申请512M的内存 一个bit位代表一个unsigned int值 读入40亿个数,设置相应的bit位 读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在 二、使用位图法判断整形数组是否存在重复 判断集合中存在重复是常见编
2009-05-19 14:13:00 1542 2
转载 腾讯的一道面试题
题目:1分钟内用户上线的数目是60万,如果用户在5分钟内重复上线,就给他发警告,问如何设计?考虑:要判断用户是否在5分内重复上线,那么至少要(也只需要)保存距当前时刻5分钟内的登录用户的信息(只要简单的ID) 从这个开始出发,需要考虑的问题为2个: 1.如何在迅速判断用户是否在保存的数据中 (这个理所当然想道用hash) 2. 如果把过期
2009-05-19 13:20:00 1238
转载 详细解说STL hash_map系列
0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: 岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典...这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰
2009-05-18 19:02:00 755
转载 QQ找茬辅助工具的制作
QQ找茬辅助工具的制作 转载请注明出处:http://www.cppblog.com/greatws/archive/2009/05/05/81996.html这段时间GF一直在玩QQ找茬,看了一下,原理很简单,就是找到2附图片的不同之处,那么程序的思路也就很明了了,就是抓图,存入buffer,比较,显示,这么一个过程。闲话不多说了,下面我用MFC来实现它。首先先要拿到QQ找茬从窗口的句柄,拿
2009-05-07 09:46:00 1196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人