摘要: MS100 [021]编程求解:输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数,使其和等于m ,要求将其中所有的可能组合列出来.思路:纯编程题,只能暴力求解。MS100 [024]反转单链表和合并链表思路:反转注意处理头尾,编程题。合并两个链表时,可用:while(lista!=null || listb!=null){ if(listb==null || lista->value value){ ... } else{ ... } }MS100 [027]跳台阶问题题目:一个台阶总共有n 级,如果一次... 阅读全文
posted @ 2012-10-08 00:56 moonswap 阅读(157) 评论(0) 推荐(0) 编辑
摘要: MS100 [011]求二叉树中节点的最大距离思路:在某个子树中,最大距离是左子树中最长枝到右子树中最长枝的距离。简单的递归,每次递归中,返回值用max(left,right)+1,当前节点所在子树的最大距离为max(left)+max(right),用一个引用变量记录最大的距离值。MS100 [013]输出该链表中倒数第k个结点输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。思路:设置两个指针p1,p2,p1和p2之间间隔k个节点。MS100 [014]两数之和为一定值输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个 阅读全文
posted @ 2012-10-07 23:08 moonswap 阅读(127) 评论(0) 推荐(0) 编辑
摘要: MS100 [002]设计包含min 函数的栈定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。要求函数min、push 以及pop 的时间复杂度都是O(1)。思路:关键在于pop时能正确得到min为栈中剩下元素的最小值。所以定义栈中的元素为struct MinStackElement { int data; int min;//保存以当前元素为栈顶时,栈中最小元素的值};MS100 [003]最大子段和问题(Maximum Interval Sum)思路:经典动态规划:令b[i] = max{ b[i-1]+a[i], a[i] }, 1<=i<=n则max{ b 阅读全文
posted @ 2012-10-06 01:36 moonswap 阅读(151) 评论(0) 推荐(0) 编辑
摘要: MS100[1]题目:把二元查找树转变成排序的双向链表输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。方案一:BSTreeNode * treeToLinkedList(BSTreeNode * root) { BSTreeNode * head, * tail; helper(head, tail, root); return head; } //基本思想:函数helper将root子树在中序下的头赋值给hea... 阅读全文
posted @ 2012-10-05 22:47 moonswap 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 2255:Tree Recovery题目分析:使用前序序列和中序序列构造后序序列的题。当时面微软实习生的时候还问过这个。前序的第一个节点就是后序的最后一个节点,且该节点把中序序列划分成左右两个子树。中序的这两个子树对应着前序的两个子树,他们的长度分别相等。代码如下:#include #include using namespace std; string getPost(string pre,string in){ if(pre.length() == 0)return "";//注意边界条件 if(pre.length() == 1)return pre; cha... 阅读全文
posted @ 2012-10-03 22:15 moonswap 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 2262:Goldbach's Conjecture题目分析:一百万个数,开辟一个数组用于标识是否是素数,用bool型表示,总内存小于1M,然后查表即可。建立素数表,对每个素数,把该素数的所有倍数所在的位置都置为false。代码如下:1048kB 50ms688 B#include int main(){ bool primeMap[1000000]; for(int i=1; i<1000000; i++){ primeMap[i] = true; } for(int i=2; i<500000; i++){ if(prime... 阅读全文
posted @ 2012-10-03 21:57 moonswap 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 1083:Moving Tables题目分析:初看似乎像贪心算法中的活动安排问题,不同的是这里的所有活动(相当于搬桌子的距离)都需要安排。有四种贪心策略:最短优先,最长优先,最早开始时间优先,最早结束时间优先。活动安排问题采用的是最早结束时间优先。此题要求所有活动都被安排,直观的想同时进行的活动相互之间的间隔最小最好。可以证明最早开始时间优先满足要求。证明:令S = P1,P2,P3,P4,P5是满足最早开始时间优先的一轮安排。即P1是所有活动中最早开始的,P2是在P1结束之后才开始的所有活动中最早开始的,依次类推。假设存在最优解A不包含上述S的安排。我们要证明存在一个等价的最优解A‘包含上述 阅读全文
posted @ 2012-10-03 20:11 moonswap 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 2159:Ancient Cipher题目分析:很简单的一道题。大意是判断两个字符序列是否可以通过字符替换(substitution)和交换(permutation)变成对方。初看似乎需要穷举所有substitution和permutation序列,但细想后发现:1.permutation让序列不用考虑顺序问题,可以看作是两个字符集合,题目简化为判断两个字符集合是否可通过substitution得到。2.substitution是任意的,只要两个序列中两个字符出现的次数相同,就可以替换。如果整个集合A中的字符都能在集合B中找到出现次数相同的字符,则A和B可以通过substitution得到。更 阅读全文
posted @ 2012-10-02 22:21 moonswap 阅读(182) 评论(0) 推荐(0) 编辑
摘要: POJ上的一些水题(可用来练手和增加自信)(poj2159,poj1083,poj2262,poj2255)初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) ... 阅读全文
posted @ 2012-10-02 21:41 moonswap 阅读(254) 评论(0) 推荐(0) 编辑