04 2013 档案

摘要:原题是这样的:一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的正负数之间相对顺序。比如: input: 1,7,-5,9,-12,15 ,ans: -5,-12,1,7,9,15 。且要求时间复杂度O(N),空间O(1) 。一道曾经做过n次的题目,当时做时没有“要求不改变原来的正负数之间相对顺序”条件,几天都没有做些虐心的算法题了,被虐贯了%>_<%一看题目先把去掉那个附加条件的经典题目扫一遍。思想简单利用快排的分类:简单到都不愿写code: 1 void func30(int a[], int n) 2 { 3 int i, j, tmp; 4 5 阅读全文
posted @ 2013-04-22 10:39 legendmaner 阅读(1831) 评论(0) 推荐(0)
摘要:题目:选择题:在如下8*6的矩阵中,请计算从A移动到B一共有多少走法?要求每次只能向上或向右移动一格,并且不能经过P。()BPAA 492 B 494 C 496 D 498看一次忘一次,决定这次再次理解一便,并更加形象的理解:试想:题目若是m*n表格里面,从A到B,不管其如何走,必然要经过m+n个格子(这个就不需要证明了吧)。然后这m+n个格子里面只有两种状态,向上或向右;而且为到达B,必须有n个向右走,m个向上走;如此,从这m+n个格子里选择n个向右走就ok了(剩下的就向上走,当然可以选择m向上走,剩下向右走)。这样可能会比原解释的要更加清楚些~其他的,参考原解释:附原解释:解答:这是有关 阅读全文
posted @ 2013-04-18 21:47 legendmaner 阅读(1557) 评论(0) 推荐(1)
摘要:题目大意:给出一个柱形统计图(histogram), 它的每个项目的宽度是1, 高度和具体问题有关。 现在编程求出在这个柱形图中的最大面积的长方形。例如:7 2 1 4 5 1 3 37表示柱形图有7个数据,分别是 2 1 4 5 1 3 3, 对应的柱形图如下,最后求出来的面积最大的图如右图所示。一开始又是各种挫计O(n^2),隐约感觉可以利用以前的某道题目的思想,然后,然后还是记不起来。。。各种整之后,还是省点时间吧~ ⊙﹏⊙b ;关键字:“单调栈”感觉凉风一阵,什么情况,从没有见过的数据结构。赶紧上google百度之:定义:单调栈,顾名思义就是说栈内的元素,按照某种方式排序下,必须是单调 阅读全文
posted @ 2013-04-18 16:06 legendmaner 阅读(2606) 评论(0) 推荐(0)
摘要:《编程之美》4.7节描述了蚂蚁爬杆问题,把所有具体数字都表示成字母后变为形如如下形式的问题:有一根长为L的平行于x轴的细木杆,其左端点的x坐标为0(故右端点的x坐标为L)。刚开始时,上面有N只蚂蚁,第i(1≤i≤N)只蚂蚁的横坐标为xi(假设xi已经按照递增顺序排列),方向为di(0表示向左,1表示向右),每个蚂蚁都以速度v向前走,当任意两只蚂蚁碰头时,它们会同时调头朝相反方向走,速度不变。编写程序求所有蚂蚁都离开木杆需要多长时间。该问题是经典问题了,有O(N)的解法。扩展问题现列出如下:第i只蚂蚁什么时候走出木杆?所有蚂蚁从一开始到全部离开木杆共碰撞了多少次?第k次碰撞发生在哪个时刻?哪个位 阅读全文
posted @ 2013-04-18 10:28 legendmaner 阅读(1144) 评论(0) 推荐(0)
摘要:编程之美的中的课后习题:问题:已知集合S有n个元素x1,x2,….xn,求其中最大的和第二大的元素。1、朴实的遍历寻找。寻找最大数的比较次数为n-1,第二大为n-2次,总次数2n-3;2、分治法。分析:我们要尽可能的减少比较次数,为简单起见,设n为2的幂。分治:把S分成大小为n/2的两个子集P和Q。如果现在直接进行归纳,则假设已知P和Q中的最大和第二大的元素,分别记为p1,p2和q1,q2,然后查找S中的最大和第二大的元素。很明显,两次比较足以找到S中的这两个元素。第一次比较最大数p1和q1,此时得到一个新的第二大的数,这个数与原来的第二大的数(P或Q中的一个)比较一次,记为所求(比较过程见下 阅读全文
posted @ 2013-04-16 09:18 legendmaner 阅读(709) 评论(0) 推荐(0)
摘要:时间限制:2 秒内存限制:32 兆特殊判题:否题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输入:输入有多组数据。每组数据仅包括1个整数S(S<=1,000,000)。如果S为负数时,则结束输入。输出:对应每组数据,若不存在和为S的连续正数序列,则输出“Pity!”;否则,按照开始数字 阅读全文
posted @ 2013-04-15 15:24 legendmaner 阅读(205) 评论(0) 推荐(0)
摘要:时间限制:1 秒内存限制:32 兆特殊判题:否题目描述:统计一个数字在排序数组中出现的次数。输入:每个测试案例包括两行:第一行有1个整数n,表示数组的大小。1<=n <= 10^6。第二行有n个整数,表示数组元素,每个元素均为int。第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。下面有m行,每行有一个整数k,表示要查询的数。输出:对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。样例输入:81 2 3 3 3 3 4 513样例输出:4方案:1、对于每一个需要查找的数在排好序数组中二分查找,如果存在,定位好之后向前向后查找出现个数, 阅读全文
posted @ 2013-04-14 22:34 legendmaner 阅读(304) 评论(0) 推荐(0)
摘要:题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i<j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。花了很长时间想还是没有想出来怎么做,怎么也不服气。。。最后还是折服了,上网查。。。才看到文章的 “排序算法汇总->归并排序”这句话的时候,兴奋不已(你妹啊!分治法~)。。放弃继续看下去 阅读全文
posted @ 2013-04-13 12:15 legendmaner 阅读(255) 评论(0) 推荐(0)
摘要:淘宝笔试题:对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。题目的只是层遍历的变形。。朋友过来一起玩了几天,不亦乐乎。。。结果写些code都是一堆一堆bug。。。 1 struct SBinaryTreeNode // a node of the binary tree 2 { 3 int m_nValue; // value of node 4 SBinaryTreeNode *m_pLeft; //... 阅读全文
posted @ 2013-04-11 12:50 legendmaner 阅读(278) 评论(0) 推荐(0)
摘要:某同学的同学摩根电面的一道题目:有一个大的textfile,里面很多英文单词,查找重复出现的单词;题目的简单:全部遍历太慢,考官说太慢,为什么不使用stl的map实现呢?如果不是单词呢?如果是url呢?为什么不使用hash_map呢?Good!如果还是单词,能不能再快点呢?能,使用强大的Trie吧!使用stl的map实现:#pragma warning(disable : 4786)#include <iostream>#include <string>#include <map>using namespace std;int main(){ map< 阅读全文
posted @ 2013-04-05 13:42 legendmaner 阅读(413) 评论(0) 推荐(0)
摘要:百度2012实习生校园招聘笔试题数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序。要求空间复杂度为O(1)。注:al[i]元素是支持'<'运算符的。先是琢磨良久,是否可能时间复杂度为O(n),因为这让我想起了,左旋转数组的相关的算法。深陷下去后,突然什么光一闪。。。果断放弃,使用最简单的算法,几分钟笔墨,错改调。(上次就是如此深陷泥潭而不可自拔): 1 void swap(int *a, int *b) 2 { 3 int tmp; 4 5 tmp = *a; 阅读全文
posted @ 2013-04-04 20:16 legendmaner 阅读(2027) 评论(0) 推荐(0)
摘要:搜狐2012.9.15校园招聘会笔试题编程题:写代码,反转一个单链表,分别以迭代和递归的形式来实现typedef struct node LinkNode; struct node { int data; LinkNode* next; }; // 返回新链表头节点LinkNode *reverse_link(LinkNode *head)LinkNode *reverse_link_recursive(LinkNode *head)真不难简单,可有些细节的东西就是不会处理。。。。⊙﹏⊙b迭代: 1 LinkNode *reverse_link_my(LinkNod... 阅读全文
posted @ 2013-04-03 16:19 legendmaner 阅读(288) 评论(0) 推荐(0)
摘要:小米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... 阅读全文
posted @ 2013-04-03 10:08 legendmaner 阅读(311) 评论(0) 推荐(0)
摘要:没头没脑琢磨了一整晚,什么P也没整出来,人不能不服老啊。。。其实以前看过,只是看懂而已,没有深刻理解;出来混总是要还得!以前从没有想过:初始条件是什么?什么时候进栈?什么时候出栈?终止条件是什么?一看题目就想如何模拟递归的方式实现。结果就载着各种细节中,而且越陷越深;想当年看递归也是这么陷入进去。。。这次卡就卡在了,什么时候出栈?是什么条件导致出栈?出栈原因很简单,遇到空指针则需要出栈了。结果进栈的时候,我还判断是否为空,空就不进栈,然后,然后就没有然后了。。。。这个是卡死的关键点,起码是我之前没有去想的。试想N个节点不是有N+1个空指针么?如果遇到一个空指针,就退栈一个节点不是OK了么~是不 阅读全文
posted @ 2013-04-02 09:32 legendmaner 阅读(203) 评论(0) 推荐(0)
摘要:不使用加减乘除,可以考虑移位。与运算可以反映两数相加的进位情况;异或反映了两数相加不考虑进位的结果;两数的相加结果就为进位的数加上不进位的数;这样,递归关系就出来;何时停止?当不再有进位的时候,就可以直接返回异或的结果了。 1 int bitadd(int a, int b) 2 { 3 int u, c; 4 u = a & b; //进位 5 c = a ^ b; 6 7 if (u != 0) 8 { 9 return bitadd(u<<1, c);10 }11 else12 {13 re... 阅读全文
posted @ 2013-04-01 12:56 legendmaner 阅读(221) 评论(0) 推荐(0)