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)
略