Algorithem
iteye_10659
这个作者很懒,什么都没留下…
展开
-
Fibonacci
Fibonacci的公式:f(n+2) = f(n+1) + f(n)。在面试中,也会有Fibonacci的变形出现,例如:已知有n级台阶,每次只能上2级或者1级,问一共有多少种上法?如果检查整个数列会发现,这个数列的同项公式正是Fibonacci,只不过数列的前两项是1和2.[code="java"]public class Stairs { public sta...原创 2011-03-27 03:46:22 · 79 阅读 · 0 评论 -
有序数组合并后寻找中间值
给定两个有序数组,长度分别为m和n,给出算法在O(1)空间和O(m+n)时间内得到两个数组merge后的中间值 1. solution1: 给每个数组赋一个指针,然后二路遍历,每次移动指针做比较,记录移动的次数 2. solution2: 注意假设现在分别取两个数组的中间值,ai和bj,如果bj-1<ai<bj,则bj就是合并后第i+j个值,也就是m...原创 2011-04-01 07:06:56 · 203 阅读 · 0 评论 -
Recent 20 problem of Google
1.给字符串求频率最高字符。字符串大咋办,多核咋办。 a. brute-force. 对每个字符依次遍历 O(n^n). b. hashtable. hashtable内保存频率。遍历完字符串再遍历hashtable. c. 还是hashtable, 但是可以对hashtable做堆处理,使得hashtable时刻都是一个Maxheap2.俩数组交集。有序或无序。 a. 二路...原创 2011-04-01 00:29:12 · 82 阅读 · 0 评论 -
寻找不在集合中的整数
给定一个集合,里面的数是从0到4G的,给出有效的算法来得到一个不在这个集合中的整数。如果只有640MB的内存,又该怎么求?对于第一个情况,可以利用external的buffer来解决。设置一个长为4G的数组,每个元素代表从0到4G的一个整数。遍历给定集合,如果遍历到的数在0和4G之间,就在数组的相应位置计数。遍历完一遍后,遍历数组,返回第一个值为0的元素。如果只有640...原创 2011-03-29 21:36:42 · 188 阅读 · 0 评论 -
递归打印字符组合
给定一个字符串,用递归的方法打印出字符串中字母的所有组合[code="java"]public class StringOperation { public static void main(String[] args) { String s = "haa"; AllArray(s); } private static void AllArray(...原创 2011-03-29 10:51:53 · 142 阅读 · 0 评论 -
在string中寻找第一个非重复character
给定一个string, 寻找第一个没有被重复的character. Method1: brute-force, 对于每个character,遍历string来检查是否有重复。O(n*n)Method2: hashtable, O(n)Method3: 同样是hashtable,将hashtable制定为次数的累计...原创 2011-03-29 08:54:42 · 94 阅读 · 0 评论 -
寻找最小的祖先
题目:给定一个binary search tree 和两个节点,寻找这两个节点的最小公共祖先。 首先要尽快给出最直接的办法,不要管效率的问题。可以利用额外的存储空间来解决这个问题,先用DFS分别寻找到这两个元素,并且记录下寻找过程中遍历的元素,得到两个数组。然后挨个比较数组中的元素,直到出现不同的为止。 这个算法首先需要额外空间,其次如果这两个元素层数很多,而且BST不是平衡的...原创 2011-03-27 06:42:29 · 151 阅读 · 0 评论 -
Tree and Graph
1. 二叉查找树是数据结构中一个非常重要的内容。因为它的查找复杂度(包括插入和删除)都达到了O(logn)的级别。每一次的迭代,都能够减少一半的查找数据量。然而,如果每个节点都只有一个孩子的话,查找复杂度就变成了O(n),因为此时实际上二叉查找树已经变成了一个链表。 2. 堆其实也是树的一种。堆最大的优点就是可以在常量时间里得到最大或者最小值。 删除和插入的复杂度是O(log(n...原创 2011-03-27 05:04:37 · 90 阅读 · 0 评论 -
tips
1. 往往来说,一个题目会至少涉及两个东西:变量和数据量。在给出算法的时候,必须要考虑两者的特殊情况,通常就是两者都非常的大。 例如,实现算法找到一个单向链表中倒数第n个元素。这个问题有很多解法,其中一个就是利用一个临时buffer来存储遍历的元素,这样只需要一次遍历就可以得到这些元素。然而,如果n非常大的时候,这个临时的buffer所占用空间就过大,也就无法达到最优解了。 2. ...原创 2011-03-27 04:31:05 · 65 阅读 · 0 评论 -
逆向输出单向链表
既然是单向链表,所以不可避免的一定是从前向后遍历。逆向输出的过程,可以看做是“找下一个”的重复操作,直到下一个是null。所以一定可以用递归来解决。当然如果利用栈来解决也是可以的。[code="java"]public static void ReverseOutput(LinkedNode head){ if(head == null) return; if(he...原创 2011-03-27 04:01:32 · 156 阅读 · 0 评论 -
LinkedList
[code="java"]public static void main(String[] args) { int length = 10; LinkedNode head = CreateLinkedList(10); } public static LinkedNode CreateLinkedList(int length){ LinkedNode hea...原创 2011-03-27 03:56:42 · 87 阅读 · 0 评论 -
BFS+DFS
利用tree来做BFS和DFS。在tree里,BFS和level-Order的遍历,而DFS和PreOrder是一样的[code="java"]public class Graph { static int index = 0; public static void main(String[] args) { char[] str = {'a','b','c','#','#'...原创 2011-03-27 03:52:41 · 102 阅读 · 0 评论 -
BinaryTree-Traverse
首先定义Node类[code="java"]public class Node { Node lchild; Node rchild; char data; int status;}[/code]主函数:[code="java"]public class BinaryTree { static int index = 0; public static voi...原创 2011-03-27 03:50:54 · 80 阅读 · 0 评论 -
Trie and Suffix
前缀树(trie)和后缀树(suffix)是两种非常重要的数据结构,往往用来加速字符串的匹配和查找。具体的介绍可见下面的资料:http://blog.csdn.net/luowen3405/archive/2011/04/01/6295839.aspxhttp://blog.csdn.net/TsengYuen/archive/2009/11/16/4815921.aspx T...原创 2011-04-12 12:23:58 · 196 阅读 · 0 评论