随笔分类 -  算法

摘要:题目:已知两个1~30之间的数字,甲知道两数之和,⼄知道两数之积。 甲问⼄:"你知道是哪两个数吗?"⼄说:"不知道"; ⼄问甲:"你知道是哪两个数吗?"甲说:"也不知道"; 于是,⼄说:"那我知道了"; 随后甲也说:"那我也知道了"; 这两个数是什么?答案:允许两数重复的情况下 答案为x=1 ,y=4 ;甲知道和A=x+y=5,⼄知道积B=x*y=4 不允许两数重复的情况下有两种答案 答案1:为x=1 ,y=6 ;甲知道和A=x+y=7,⼄知道积B=x*y=6 答案2:为x= 阅读全文
posted @ 2012-10-12 15:06 Jack204 阅读(9636) 评论(0) 推荐(1)
摘要:根源在于人的身体是左右对称的,而不是上下对称和前后对称。题中"影像"这个词有歧义,一种理解是“自己的影像”,另一种理解是“世界的影像”。先说第一种理解。其实按照镜面成像的原理,镜子中的影像(镜中人)与被映照的原像(境外人)并非左右颠倒,也并非上下颠倒,而是关于镜面对称。由于人的身体在大体上是左右对称的,而上下完全不对称,所以我们会误以为“影像可以颠倒左右,却不能颠倒上下”。第一种理解得到的结论与问题中的结论相悖,所以第二种理解更有可能符合出题人本意。再说第二种理解。从镜中人的角度看来,我们左边的物体的影像在镜中人的右边,我们右边的物体的影像在镜中人的左边,我们上边的物体的影 阅读全文
posted @ 2012-10-11 16:26 Jack204 阅读(7927) 评论(0) 推荐(0)
摘要:今天阿里笔试题的倒数第二道,给数组排序,这个数组的特点是任一元素现在的位置和把数组排好序后它的位置距离小于k,即a[i]元素在数组排序后将位于{i-k,i+k}这个区间内。要求时间复杂度小于o(nk)。某人的分析:因为交换范围不可能超过(i-k,i+k),所以每排完一轮2K,2K中的前K个就是已排好的,不会再动了,这时候可以直接偏移掉比O(nlogn)和O(nk)小的,只剩下O(nlogk),O(n),O(logn),O(1)这几种情况了,排序算法基本不可能后两种,O(n)的排序都有庞大的空间开销或者特殊的数据范围(比如字节组),所以这种有个参数k的题,根据经验也是O(nlogk)。方法1:建 阅读全文
posted @ 2012-10-10 09:40 Jack204 阅读(1358) 评论(1) 推荐(0)
摘要:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字)。如何才能从这个无穷尽的流中随机的选取1000个关键字?定义长度为1000的数组。对于数据流中的前1000个关键字,显然都要放到数组中。对于数据流中的的第n(n>1000)个关键字,我们知道这个关键字被随机选中的概率为 1000/n。所以我们以 1000/n 的概率用这个关键字去替换数组中的随机一个。因为此时对于第n个关键字,它被选中的概率为:1000/n=p.而对于前面n-1个关键字来说,可以分成2步:第一步,先在n-1个关键字中,被选q=1000/n-1的概率选为n-1中的1000个。第二步,在这10 阅读全文
posted @ 2012-09-21 14:03 Jack204 阅读(1834) 评论(0) 推荐(0)
摘要:题目:Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键 字,请说明思路并编程实现方法String extractSummary(String description,String[] key words),目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。先来看看这些序列:w0,w1,w2,w3,q0,w4,w5,q1,w6,w7,w8,q0,w9,q1分析当初看这道题时,看了好了几遍都没看懂。后来总算弄明白:给出的字符串是用其它程序分好词的,关 阅读全文
posted @ 2012-09-03 13:41 Jack204 阅读(2575) 评论(0) 推荐(1)
摘要:一、B树 1、B树的定义B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件:(1)每个结点至多有m个子结点;(2)每个非根节点所包含的关键字个数 j 满足:┌m/2┐ - 1 <= j <= m - 1;(3)若根结点不是叶子结点,则至少有两个子结点;(4)所有的叶结点在同一层;(5)有k个子结点的非根结点恰好包含k-1个关键码。2、B树的查找B树上的查找是一个顺指针查找结点和在结点内的关键码中查找交叉进行的过程。从根结点开始,在结点包含的关键码中查找给定的关键码,找到则查找成功;否则确定给定关键码可能在的子树,重复上面的操作,直到查找成功或者指针为空为止。下图显示了 阅读全文
posted @ 2012-08-22 16:57 Jack204 阅读(6156) 评论(1) 推荐(0)
摘要:本文转自:http://www.cnblogs.com/lovexinsky/archive/2012/03/09/2387583.html在实际的工作环境下,许多人会遇到海量数据这个复杂而艰巨的问题,它的主要难点有以下几个方面:一、数据量过大,数据中什么情况都可能存在。如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千万级别,甚至过亿,那不是手工能解决的了,必须通过工具或者程序进行处理,尤其海量的数据中,什么情况都可能存在,例如,数据中某处格式出了问题,尤其在程序处理时,前面还能正常处理,突然到了某个地方问题出现了,程序终止了。二、软硬件要求 阅读全文
posted @ 2012-07-31 19:52 Jack204 阅读(588) 评论(0) 推荐(0)
摘要:第一部分、十道海量数据处理面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。然后再在这1000个最大的IP中,找出那个频率最大的IP,即为所求。或者如下阐述(雪域之鹰):算法思想:分而治之+Hash1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;2.可 阅读全文
posted @ 2012-07-30 09:50 Jack204 阅读(427) 评论(0) 推荐(0)
摘要:150行以内的程序保持较高的1Y率咱们先练到50行,然后练到100行。 在ICPC比赛中,个人能力方面,如果粗略地分的话,大致可以分为算法能力、代码能力和查错能力。那些大学才开始参加比赛的选手,写代码的基本功一般会比较扎实,主要瓶颈应该是算法能力。而对于OI转ICPC的选手来说,代码能力往往是最大的缺陷。随着OI转ICPC的选手逐渐增多,代码能力的问题愈发暴露了出来。一、如何定义代码能力 Comars曾经给代码能力作过一个比较准确的定义。2004年暑假时,Comars曾经说过:他认为150行以内的题目,他的1Y率非常高,并且保持稳定;而当代码长度超过150行以后,1Y率就开始急速下降了。如果我 阅读全文
posted @ 2012-05-28 16:30 Jack204 阅读(5000) 评论(0) 推荐(0)
摘要:【问题】给定两个长度都为N的有序数组X和Y,写一个函数来找到X和Y合并后的数组的中位数。【解答】:首先明确一点,因为X和Y长度一样,所以中位数肯定是有两个的,左中位数和右中位数。现在我们的思路是,要不断缩小两个数组的长度,同时保证那两个中位数总是在两个数组中,当两个数组的长度足够小的时候,我们就可以轻易找到答案了。为了方便叙述,我们假定我们可以对数组的每个元素染色,染成黑色或者白色。假设左右中位数分别为a,b。那么,我们把X和Y中所有小于等于左中位数的数都染成白色,把所有大于等于右中位数的数染成黑色。由于X和Y是有序的,所以X和Y它们的颜色都必定是一串白接着一串黑,而且X里的白色数的个数等于Y 阅读全文
posted @ 2012-05-27 22:02 Jack204 阅读(2903) 评论(0) 推荐(0)
摘要:背景:同室四人各写一张贺卡,先集中起来,然后每人从中拿一张别人送出的贺卡,四张贺卡的不同分配方式有多少种?问题:错排问题:有n个正整数1,2,3,……n,将这n个正整数重新排列,使其中的每一个数都不在原来的位置上,这种排列称为正整数1,2,3,……n的错排,问这n个正整数的排列方法有多少种?递推公式f(n)=(n-1)[f(n-1)+f(n-2)](n>2),f(1)=0,f(2)=1.(欧拉发现)将n个元素的全错位排列分成2步完成:第一步,对于n中的任意一个元素(如1)有n-1种(其它的2,3,4…n)选择。第二步,假设元素1选择了位置k,那么接下来排k,又将k的排法分成两类:第一类, 阅读全文
posted @ 2012-05-27 20:41 Jack204 阅读(496) 评论(0) 推荐(0)
摘要:while(curr) { //print left most node, notice the root node if ((curr->left && curr->left->visited == false) || (curr->right && curr->right->visited == false)) { while (curr->left || curr->right) { if (curr->left && curr->left->visited == false 阅读全文
posted @ 2012-05-10 22:51 Jack204 阅读(449) 评论(0) 推荐(0)
摘要:代码思路:1 写代码的思路可不是从上往下写,是一个不断的修正的过程。while, if...else, 是一个将算法(手动解决问题的办法)自动化的过程。2 所以如果想要自动化,非自动化的过程的每一步首先要清楚。3 用刘博的话说:我只写我能想到的东西,每一步不要想的太多,自己想到了之后,想一下该如何让程序按照你的思路来运行。这句话可以这么理解,假如有这么个程序结构:while () { --------------------0 if () { --------------------1 } else { -------------------... 阅读全文
posted @ 2012-04-29 13:12 Jack204 阅读(355) 评论(0) 推荐(0)
摘要:先声明我们根据条件可以知道皇后肯定是每行都有且只有一个所以我们创建一个数组x[t]让数组角标表示八皇后的行,用这个角标对应的数组值来确定这个皇后在这行的那一列。我们用递归来做:这问题要求皇后所在的位置必须和其他皇后的位置不在同一行、列还有 把两个皇后看成点其|斜率|=1所以我们就要写这个限定条件用一个函数来实现:函数内对没一个已经放好的皇后的位置进行判断,所以就要有个循环。我们既然是用递归来解决问题那就要把这个问题分成一个个相同的小问题来实现对吧!这小问题是什么呢,不难发现我们要在8*8的方格里放好8个皇后那我们就要知道在8(列)*7(行)是怎么放的在有我们事先写好的判断函数放好最后行就搞定了 阅读全文
posted @ 2011-10-18 00:04 Jack204 阅读(395) 评论(0) 推荐(0)
摘要:问题描述:1 You have a knapsack that has capacity (weight) C.2 You have several items I1,…,In.3 Each item Ij has a weight wj and a benefit bj.4 You want to place a certain number of copies(可以有重复) of each item Ij in the knapsack so that:5 The knapsack weight capacity is not exceeded and6 The total benefit 阅读全文
posted @ 2011-10-15 00:20 Jack204 阅读(532) 评论(0) 推荐(0)
摘要:关键在于如何寻找增广路径:初始时最大匹配为空for 二分图左半边的每个点i do 从点i出发寻找增广路径。如果找到,则把它取反(即增加了总了匹配数)如果二分图的左半边一共有n个点,那么最多找n条增广路径。如果图中共有m条边,那么每找一条增广路径(DFS或BFS)时最多把所有边遍历一遍,所花时间也就是m。所以总的时间大概就是O(n * m)。增广路径的性质:(1)有奇数条边。(2)起点在二分图的左半边,终点在右半边。(3)路径上的点一定是一个在左半边,一个在右半边,交替出现。(其实二分图的性质就决定了这一点,因为二分图同一边的点之间没有边相连,不要忘记哦。)(4)整条路径上没有重复的点。(5)起 阅读全文
posted @ 2011-10-07 11:25 Jack204 阅读(386) 评论(0) 推荐(0)
摘要:问题1、判断链表是否存在环。 设置两个指针fast和slow,初始值都指向头指针,slow每次前进一步,fast每次前进两步。如果存在环,则fast必先进入环,而slow后进入环,两个指针必定相遇(见下面的证明1)。(当然,fast先到达尾部为NULL,则为无环链表)。程序如下: bool isExitsLoop(Node* head) Node *slow = head, *fast = head; //fast && fast->next保证了fast可以接着向下移动 while(fast && fast->next) slow = slow-& 阅读全文
posted @ 2011-09-14 11:10 Jack204 阅读(3624) 评论(0) 推荐(0)