http://www.mianwww.com/html/2013/03/17814.html
在linked list中找倒数第N个结点
2. 倒转linked list
3. 二叉树的结点有指向parent的指针,求最近公共祖先
4. 给一个数组,如何打印该数组成员构成集合的全部子集合.
5. 有两个字符串,一个是text,一个是command, Command有四种:
‘+’: 在text中前进一位
‘-’: 在text中后退一位
‘a’: 在当前位置插入一个字符,字符由command中的后一位决定
‘d’: 删除当前字符
实现函数Process(string& text, string& command, string& result);
Coding题,大致要点:
扫描一遍command,看看有多少加字符的command,再建一个满足大小要求的临时数组,copy text
在临时数组上进行操作,注意插入和删除的复杂度都是O(N)
6. 实现一个LRU的cache
数据结构:
插入新cache的算法:
如果找到了,用splice函数将刚刚被访问的CacheEntry移到队首。
关于多线程,一般来说reader/writer lock不适用,因为reader也会更改LRU cache. 一种解决的办法是让每个线程拥有自己的cache.
7. 两个排序的数组,求它们的交集
8. 在二叉树中添加额外的两个指针(树可能非满),遍历整棵树并将同一层的结点用这两个额外指针连接起来
9. 用一个给定的值partition一个数组,注意这个值不一定在数组中出现
10. 用数组实现一个queue, 考虑以下一些内容:
a) 实现固定size
b) 实现可变size 每次size不够用时,建一个更大的array并复制原有数据
c) 与linked list的实现相比,有什么好处和坏处?保证了操作恒定为O(1),但是内存有浪费,且不连续
d) 如何处理thread safe
在queue被更改的情况下,使用locker
Lock-free code,
11. 洗牌算法
For i = 0 to n-1,
生成一个i到n-1之间的随机数j,将v[i]与v[j]交换
12. [Microsoft] 对stack上的元素排序,可以使用的方法有pop(), top(), push(), isEmpty(), isFull().
13. [Microsoft] 有一个M*N行的矩阵,如果第(i, j)个元素是0,则把i行和j列都设为零,注意尽量少使用额外空间
分成如下几步:
扫描第M行和第N列,看(M,N)是否需要设为零
扫描每行和每列,在第M行和第N列记录对应的列和行的结果
扫描第M行和第N列,将其所对应的列和行记为零
处理(M,N)
14. [Microsoft] 一个二维空间第一象限有很多点,怎么找出最外围的那些点?
Graham扫描算法:
选出y最小的起始点p0
将其它所有点按相对于p0的极角排序,记为p1,p2,…pN-1
将p0, p1, p2 push到栈
对余下的所有点:
a) Px为栈顶的下一个点,Py为栈顶,当前点为Pi
b) 如果Py->Pi, 相对于Px->Py向右
i. Pop栈
ii. Push Pi到栈
算法复杂为O(NlogN) (第二步的排序)
15. [Google] 返回一组字符串的最长公共前缀,如 “abc”, “abcdef”, “abcd”, 则返回”abc”
16. [Microsft] 给出平面上第一象限内landscape的轮廓,也就是一些列的(x,y)坐标, x=0,1,…,N
,以及Y轴上光源坐标(0,H)。问这N+1个点钟那些被照亮那些是阴影。(叉乘)
一一计算光源到(x,y)的角度,再与左边的角度对比即可知是否被遮挡,复杂度O(N)
17. [Microsoft] 一个linked list,每个节点除了正常next指针外,还有一个extra指针,这个指针可以指向链表中的任一节点,不同的extra指针可以指向同一个节点,extra指针也可能
形成loop。问怎么复制这个结构。
18. [Microsoft] 怎么组织字典,使得在解cross puzzle时可以很快得到满足条件的所有单词(比如
所有第二个字母是o,第5个是H的单词)。不过这题算brain storm,不用写code.
按单词的长度不同,构造多个container
对某一组长度相同的单词,构造多个index, 从(2,o), (5, H) 映射到单词(id), 每一个collection保持有序,可以加快merge的速度
19. [Google] 如何设计binary tree和hash table的iterator
Binary Tree Iterator:
假设是中序遍历的话,在iterator中保存一个遍历的状态(parent node stack).
Hash Table Iterator:
取决于hash table的数据结构,一般直接按array或者bucket顺序遍历就可以了。
20. [Google] 设计一个class,类似于stack, 但可以是O(1)时间内返回min()
给stack加一个只用来保存当前最小值的stack, Push时,如果当前值比minStack栈顶小,则也push到MinStack, Pop时,如果minStack栈顶与当前pop元素一样大,则也pop minStack
21. [Google] 比较两个binary tree是不是完全一致
递归比较 if (tree1->value == tree2->value) && is_equal(tree1->left, tree2->left) && is_equal(tree1->right, tree2->right)
22. [Google] 一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数
考虑二个数a,b, a与b先比,大的与当前最大比,小的与当前最小比。两个数共需要比较三次。
23. [Google] 在一个循环有序的数组里查找一个数
24. [Google] 给一个array和一个target value, 检查array里是否存在两个数之和为target
两种做法:
先对数组排序,然后从两头开始scan
建一个hash table, 然后scan 数组,去查找,注意要处理正好有一个数等于target的一半的情况
25. [Google] 给一个文本, 然后给出几个关键词及他们所出现的位置,比如
this: 1, 16, 55….
is: 5, 33, 77…
要求找出最短的一段文章使其具备给出的关键词。
大致算法:按位置往后找,直到所有的词都出现,然后再尝试把左边的位置缩减。如此直到找到更短的区间。
见后面的find_min_window的程序,这里需要处理inverted index
26. [Google] 给出一棵tree, 该tree没有任何特征, 即可以有多个子节点, 父节点和左右子节点也
没有大小关系。但每个节点的值不相等。现给出几个值, 如(12, 24) 请找出从根节点到值为12 和24的节点的subtree.
27. [Google] 给一个array, 再给一个sh值, 设计函数将数组内的所有元素向右偏移sh个位置(将数
组看成一个圈)。
见Programming Pearls, 先把[a,c] reverse, 再reverse[a,b],[b,c]
28. [Microsoft] 删除数组中的重复元素
略。。。
29. [Microsoft] 按如下规则转化数字的字符串
(integers that appear >=1 times)
(integers that appear >=2 times)
…
(integers that appear >=n times)
并保持字符原来的顺序
例如: 12223314->12342312
略。。。
30. [Microsoft] 检查一个表达式中的括号是否合法,括号包括 {, [, (, ), ], }
简单的栈的应用
31. [Microsoft] 如何高效地用堆栈模拟队列.
使用两个stack, s1和s2
Push时,push到s1
Pop时,若s2非空,则从s2中pop, 若s2为空,则将s1的全部元素pop到s2中,再从s2中pop
分摊复杂度为O(1)
32. [Microsoft] 打印中两个整数范围内的所有素数,例如:(12, 15) ->13
1. 单个验证是否为素数
2. 筛法
33. [Google] 求直方图的最大内接矩形
TODO
34. [Google] NxN行列有序的矩阵查找一个数
两种方法,1从角上开始search, 2, Divide and Conquer
分治法可以用来解决另外一个问题,在行列有序的二维数组中,大于/小于0的元素有多少个?
35. [Google] 将MxN的矩阵转秩,要求O(1)的空间复杂度.参考群论中cyclic group,group
generator
TO LEARN
36. Inplace perfect shuffle
TO LEARN
37. 有一个矩阵A,找出这个矩阵中所有的A(i,j),它所在的行和列都是0.
依次扫描?略。。。
38. 有一个变长的characters system, 每个character所占的bytes数不固定。每个
character的最后一个byte的值是0. 一个字符串由这些变长的characters组成。字符串
的最后两个bytes是0. 要求反转这个字符串。额外空间使用越少越好。
先将整个字符串反转,再按个字符反转
39. 有n张扑克牌,从中随机选出几张。要求找出所有的选法,使得所选扑克牌的点数的
和是s. 不用recursion,代码行数越少越好。
TODO 如何不用recursion?
40. [Google] 有1G内存和4 billion个整数,输出一个不在这些整数内的数, 如果只有10MB内存呢?
1. 1G内存有1024*1024*1024*8个位,扫描一遍记位即可
2. 如果内存不够,可以依次处理10*1024*1024*8个数,需要扫描4*1024/10/8大概50趟
41. [Google] Merge N个sorted array
42. [Google] 给一个大小为N的数组,输出所有大小为K的子集(K<=N)
TODO
43. [Microsoft] 已知 bst 和两个数, 求在此范围内的节点数。递归和非递归
中序遍历,加一个collection作为参数即可
44. [Microsoft] 已知 bst 和一个数, 找到next larger number, O(logn)时间
TO CODE
45. N*N的正方形内有黑白两色,求四边都是黑色的最大的子正方形
TO LEARN
46. 平面上有一组点集,求穿过点最多的直线
计算两两点够成的直线方程x+By+C=0, 找出出现次数最多的方程即可
47. 实现itoa
48. 给一个2D 的 matrix,按 spiral order打印
49. [Google] 一个字符串,复制所有的’x’, 再删除所有的’z’, 其它不变
略。。。
50. [Google] 实现memcpy(void *src, int size, void *dest);
判断参数合法性,判断src,dest是否相等, 是否 overlapping 时会出错,
注意memcpy和memmove的区别
51. [Google] 大小为N的数组,给出一个大小为K的随机子集
作一个shuffle,然后选取前K个(因此shuffle时只要进行到第K个即可)
52. [Microsoft]判断这四个点是不是构成了一个矩形
TODO
53. 实现 char* strtok(char* str, const char* delimeter)
略。。。应该需要用到static变量
54. 美国的coin设计为1,5,10,25,任意给定一个change,用greedy algorithm可以算出最少所需要的coins,如何判断一组coin是否可以用greedy algorithm?
TO LEARN
找硬币的DP程序:
55. 给定5张牌,写一个函数判断是否有两对
略。。。
56. 在BST中删除一个节点
57. [Microsoft] 给你一个地址/a/b/../c/./d.txt, 让你把它normalize。
58. [Microsoft] 给出一个BST和一个值,求所有和等于这个值的Path.
59. [Microsoft] 按层打印树
略
60. [Google] 五个非常大的数组求交集(考虑时间,空间,I/O)
略
61. [Google] 两个排序好的数组,求和最小的M个pair, 比如 A={1, 2, 4, 5, 6}, B={3, 5, 7, 9}
m=3那么Results就是(1, 3),(2, 3),(1, 5)
这个结构形成了一个行列有序的矩阵,这个题就类似于在行列有序的矩阵中找第k个元素。
结论是:
对于一个n×m(n≤m)的矩阵,若每行和每列都是递增的,则可以在O(nlog2m/n)找到第k大的数。论文题目为“Generalized Selection and Ranking: Sorted Matrices”
如果是查中位数:
先找出每一行(列)的中位数,再找出中位数的中位数,这样可以去掉接近一半的数,再在剩下的数里找中位数即可,复杂度O(N(logN)^2)
62. [Microsoft] 一个数组,有大小写字母和数字,一次编历,大写字母在一起, 小写字母在一起,数字在一起.
见138. Dutch National Flag Problem (DNFP)
63. [Google] 1. 给定一个树和任意2个nodes,找出来最小的subtree包含这2个nodes 第26题
2. 写BFS算法打印subtree的nodes 等价于分层访问树
3. 如果把树变成了graph(可能有loop),怎么改刚写的BFS 需要标记已经访问过的点
64. 实现next_permutation
算法:
1. 从后往前找,找到第一个x1,使a[x1]<a[x1+1]
2. 从后往前找,找到第一个x2,使a[x2]>a[x1]
3. 交换a[x1],a[x2], 并且反置a[x1+1 … end]
65. 最长上升子序列
66. 给一个single linked list, 里面有true和false两类的node,写一个程序把
true node 和false node分类,并且中间生成一个新的node把两类分开。
将true和false两类node接到两个不同的list,最后再合并即可
67. 1 billion query里选出时间最近5分钟内最frequent的1000个query,one pass
精确解:选出所有5分钟内的query,count每个query的个数,同时维护一个最大堆,最后得到查询
扩展:如果query的数量非常大,则可以在一个个time windows里面做一些sample, 最后把这五分钟内的sample结果合并起来
68. 两个排序数组找共同中值。
69. 实现strstr(str1, str2)
70. 给定一个排好序的linked list,删除其中所有的重复元素。比如给定1->2->3->3->
4->4->5,返回1->2->5。给定1->1->1->2->3,返回2->3