随笔分类 - algorithm
摘要:小米2013校园招聘笔试题看一眼不会做;再看一不就是求无连通图的个数么;再想了想,挫计一堆再想算了,不想了;头发短见识短。。。查,一篇文章关于并查集,还开始没看,什么光一闪,笔墨伺候。。。其实太简单了,真是见识短: 1 int myfriend(int n, int m, int* r[]) 2 { 3 int *flag,i,tmp; 4 int cnt; 5 int cnt2; 6 7 flag = (int *)malloc(sizeof(int)*n); 8 9 for (i=0; i<n; i++)10 {11 fl...
阅读全文
摘要:没头没脑琢磨了一整晚,什么P也没整出来,人不能不服老啊。。。其实以前看过,只是看懂而已,没有深刻理解;出来混总是要还得!以前从没有想过:初始条件是什么?什么时候进栈?什么时候出栈?终止条件是什么?一看题目就想如何模拟递归的方式实现。结果就载着各种细节中,而且越陷越深;想当年看递归也是这么陷入进去。。。这次卡就卡在了,什么时候出栈?是什么条件导致出栈?出栈原因很简单,遇到空指针则需要出栈了。结果进栈的时候,我还判断是否为空,空就不进栈,然后,然后就没有然后了。。。。这个是卡死的关键点,起码是我之前没有去想的。试想N个节点不是有N+1个空指针么?如果遇到一个空指针,就退栈一个节点不是OK了么~是不
阅读全文
摘要:时间限制:1 秒内存限制:32 兆特殊判题:否题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。输入:每个测试案例包括2行:第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数。第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]。输出:对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1。样例输入:91 2 3 2 2 2 5 4 2样例输出:2 1 #inc
阅读全文
摘要:电路布线在一块电路板的上、下两端分别有n个接线柱。根据电路设计,要求用导线(i,π(i))将上端接线柱i与下端接线柱π(i)相连,如图所示。其中,π(i),1<=i<=n是{1,2,…,n}的一个排列。导线(i,π(i))称为该电路板上的第i条连线。对于任何1<=i π(j)。在制作电路板时,要求将这n条连线分布到若干绝缘层上。在同一层上的连线不相交。你的任务是要确定将哪些连线安排在第一层上,使得该层上有尽可能多的连线。换句话说,就是确定导线集Nets={ i,π(i),1<=i<=n}的最大不相交子集。今天看书实在看不下去,闲得无聊随手拿了本算法书以乱心智。心烦
阅读全文
摘要:时间限制:1 秒内存限制:32 兆特殊判题:否题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天JOBDU测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?输入:输入有多组数据,每组测试数据包括两行。第一行为一个整数n(0<=n<=100000),当n=0时,输入结束。接下去的一行包含n个整数(我们保
阅读全文
摘要:时间限制:1 秒内存限制:32 兆特殊判题:否题目描述:公司现在要对所有员工的年龄进行排序,因为公司员工的人数非常多,所以要求排序算法的效率要非常高,你能写出这样的程序吗?输入:输入可能包含多个测试样例,对于每个测试案例,输入的第一行为一个整数n(1<= n<=1000000):代表公司内员工的人数。输入的第二行包括n个整数:代表公司内每个员工的年龄。其中,员工年龄age的取值范围为(1<=age<=99)。输出:对应每个测试案例,请输出排序后的n个员工的年龄,每个年龄后面有一个空格。样例输入:543 24 12 57 45样例输出:12 24 43 45 57还是华丽
阅读全文
摘要:时间限制:1 秒内存限制:32 兆特殊判题:否题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。输入:输入可能包含多个测试样例,对于每个测试案例,输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数。输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000)。输出:对应每个测试案例,输出旋转数组中最小的元素。样例输入:53 4 5 1 2样例输出:1题目
阅读全文
摘要:随机数组中最大K个数:3, 2 ,1, 6, 4, 5最大的3个为:6,4,51、选择排序法。每次将待查询数组的最大一个找出,放入已查询数组中,一直找到K个为止。时间复杂度O(N*K)2、堆排序法。使用小顶堆,存放最大K个元素。查询数组元素,如果堆中未满K个元素,则添加到堆中。如果堆里的元素满K个,且需查询的元素比堆的最小元素还大,则将最小的元素替换,更新小顶堆。如果堆里的元素满K个,但需查询的元素不比堆的最小元素大,则无需其他操作。时间复杂度O(N*log(K))void shift(int b[], int i, int n){ int k,tmp; k=i; if ((...
阅读全文
摘要:20、甲、乙两个人在玩猜数字游戏,甲随机写了一个数字,在[1,100]区间之内,将这个数字写在了一张纸上,然后乙来猜。如果乙猜的数字偏小的话,甲会提示:“数字偏小”一旦乙猜的数字偏大的话,甲以后就再也不会提示了,只会回答“猜对 或 猜错”问: 乙至少猜 多少次 猜可以准确猜出这个数字,在这种策略下, 乙猜的第一个数字是多少???答案:猜测序列是14,、27、39、50、60、69、77、84、90、95、99因为无论第几次猜大了,最终的总次数总是14。 这个题目类似于一道Google面试题:扔玻璃球求最高楼层。。一道关于动态规划的面试题——Google面试题:扔玻璃珠某幢大楼有100层。你手里
阅读全文
摘要:今天想到了昨天看到一道acm题目,难度入门级别。“谁看的最多”,题目大概是这样的:一队列的人3 2 1 6 4 5,数值的大小表示该人的高度。每个人只能看到前面比他高的人,如1可以看见2、3。但是,如果有人B比他高,那么他就不能看到这那个B之前比B低的人了。如5,因为6比他高,他只能看到6,但看不到6之前的人(如果之前有7、8之类比6高的,5也可以看到)。而4比5低也看不到。题目想了个大概就没有想了,又是卡在里动态规划的状态里。F(i)表示第i个人看到的人数。如果他前一个人比i低,则i看到的最多只有一个了,就是i-1。如果他比前一个高,则看到的就是前i-1个人第一个比他高的人看的人数加一。如果
阅读全文
摘要:描述:有一个像这样的数字三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5从顶点开始,每个数字向下层走只能有左下和右下两个方向,求出到达最后一行时的最大路径之和.今天从一本acm算法书看到的。题目不算难,但书里写的东西不错。解释在动态规划中,你所定义的状态很关键。同一个问题如果你定义的状态不同,你所得的状态转移方程自然不同。这有点废话。可严重的是,如果状态没定义好的话,甚至你根本用不了动态规划。因为你定义的状态根本不满足动态规划的基本要求:最优子问题,无后效性。所以这其实也是卡住很多人的地方。每次看这些题目的时候,总隐隐地觉得它满足...
阅读全文
摘要:时间限制:1 秒内存限制:32 兆特殊判题:否题目描述:淘宝公司内部有一个字符串小王子,他平常无聊就研究字符串。一天,他在研究字符串TBTBBT时,他定义了一个统计函数F,F(S)表示一个字符串当中S出现的次数。对于字符串TBTBBT,那么就有F(T)=3,F(B)=3,F(TB)=2,F(BT)=2。但如果我们已知F(T),F(B),F(TB)和F(BT)这四个值,你能求出满足这4个条件,同时字典序最小的字符串么?若存在,则输出这个字符串;若不存在,则输出-1。值得注意的是,字符串小王子认为T是比B小的,因为如果B比T小,那么字符串开头可能就会是BTTB,哈哈,你们邪恶了吧。输入:每个测试文
阅读全文
摘要:2012年九度互动社区淘宝实习生春季招聘上机考试http://ac.jobdu.com/contest.php?cid=1035虽然过期,练练也未尝不是件好事。时间限制:1 秒内存限制:32 兆特殊判题:否题目描述:淘宝公司内部有许多新鲜的小玩具,例如淘宝智能机器人。小时候,大家都玩过那个吃豆子的游戏吧,这机器人就是按照这个游戏设计的,它会朝着豆子的方向行走。不过机器人还存在一个bug,他只会朝南和朝东走。现在有一块空地,分成了n*m个格子,每个格子内有一颗豆子。机器人的起点在西北角,终点在东南角。请问机器人从起点到终点有多少种不同的方法。输入:每个案例输入只有一行,有n和m两个正整数,n,m
阅读全文
摘要:给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:不允许使用除法;要求O(1)空间复杂度和O(n)时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);请用程序实现并简单描述。虽然前不久做了一次,但手写还是错,临界问题未考虑清楚。。。。闷~现在查错不使用调试。。。下次要学会证明算法的正确性。 1 void func3(int a[], int b[], int n) 2 { 3 b[n-1] = 1; 4 5 for (int i=n-1; i>0...
阅读全文
摘要:11、求一个全排列函数:如p([1,2,3])输出: [123],[132],[213],[231],[321],[312].2、求一个组合函数如p([1,2,3])输出: [1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]这两问可以用伪代码。void swap(int *a, int *b) //交换函数{ int tmp; tmp =*a; *a=*b; *b=tmp;}以为很简单,手写全排序第一遍就错了。func1( a[], n, m) if(m>n-1) return; end print(a); for(i=m+1...
阅读全文
摘要:题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。解:如果只是最简单的遍历,时间复杂度为O(n)。这样不符合题意,而且也没有充分的利用题目的已知条件“排好序的数组”。这题目老早之前做过一次。印象中使用了两个指针p、q,一个指针p指向数组头,一个q指向末尾。指针p只往大的方向走;q只往小的方向走;比较这两值之和与指定数的大小关系。若大了,则q往小的方向走;若小了,则p往大的方向走;
阅读全文
摘要:Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(String description,String[] key words)目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。 解:简化题目:从一个字符串A中找出包含另一个字符串B所有字母的最小字串。(比A短,并每个字母只出现一次;这里先排除了关键词多次出现的情况,这种情况只需稍微改动即可),考虑使用两个指针p、q指向A起...
阅读全文
摘要:1 #include <iostream> 2 3 using namespace std; 4 5 6 void p(int a[], int n) 7 { 8 int *p,*q; 9 int tmp;10 11 p= a;12 q = a+n-1;13 14 while(p<q)15 {16 while(p<q && *p%2==1)17 p++;18 while(p<q && *q%2==0)19 q--;20 if (p<q)21 ...
阅读全文
摘要:题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:把题目换一下,如果出现不同的数字只有一个,这可以很容易实现,即把所有的数字异或即可得出结果;可是,现在的题目是有两个不同的数字。全部异或的结果只能是这两个不同数字的异或。由于两个数字不同所以他们异或的结果不为0,即意味这两个不同的数字有其中的某一个比特位不同。所以可以根据这个比特为的不同将所有的数据分为两类,则这两个数字将分别在不同的分类中。此时分别对这两类按照之前的方法,把他们(同一类的数据)分别异或将得到这两个不同的数字。#include
阅读全文
摘要:#include <iostream>using namespace std;#define STR_SIZE 1024#define PAR_SIZE 128char str[STR_SIZE] = {"abaababaddecab"};char par[PAR_SIZE] = {"abaabcaba"};void printarray(int *a, int size);int cal_k2(char *par, int *par_next, int k2, int j);void cal_next(char *par, int *par
阅读全文

浙公网安备 33010602011771号