算法类面试题-3

来源:互联网 发布:创业软件经营状态 编辑:程序博客网 时间:2024/05/22 22:24

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. 1.  从后往前找,找到第一个x1,使a[x1]<a[x1+1]
  2. 2.  从后往前找,找到第一个x2,使a[x2]>a[x1]
  3. 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

   

71. 返回给定字符串的第一个不符合字母顺序的index, 比如abcdaf就需要返回第二个a的index,比如aZe就返回e的index

    依次扫描即可。。。

 

72. 检查sudoku的输入是valid,允许solution是不完全的

    略

 

73. 实现 wildcast string matching.

    74. 给你一本dictionary,任意给你七个letters,让你找出包含这七个字母的、最长的单词。条件:可以pre-processing,这样每次给你不同的letters时,可以very efficient

将单词按长度从长到短编号

对每一个字母,建一个collection,按编号排序。

对给出的七个字母,找到它们的collection中的第一个共同的字母。

 

75. 表达式求值

    76. 两个string, 给出它们的两个substring, 定义它们的距离为distance=\sum_i|s1[i]-s2[i]|, 怎么找距离最大的两个substring?

    穷举。。。 有没有更好的办法?

 

77 N*N的0/1矩阵,找出最大的全0矩阵

最大直方图的应用, O(N^3)时间复杂度

 

78. 将一个linked list按不同元素的值分组

    用多个head放不同元素的组,最后合并

 

79. serialize and re-construct binary tree.

    按pre-order遍历,写入结点,包括NULL的子结点

    Re-construct的时候,读入结点,构建node,再递归构建child,(当该Node不为空)

 

80. 手机上的电话号码提示, 用prefix tree

    CODE prefix tree

 

81. [Facebook] 给定一个数组,删除最少的元素使得剩下的元素有序

    等价于找最长上升(下降)子序列,见65题

 

82. [Facebook] BST中找中间节点

    中序遍历一遍放到数组中,最后拿中间数

 

83. [Facebook] implement char *remove_badchars(char string[], char bad_chars[]) in place。

    将bad_chars放到hash中查询,用两个指针来remove bad char, code略。。。

 

84. [Facebook] implement adding two unsigned numbers without using “+”

    85. [Facebook] How to implement a smart_pointer

    TO LEARN

 

86. [Facebook] implement sqrt

    87. [Facebook] implement reader/writer lock

    TO LEARN

 

88. given a word a and a word b, all are 6-letter. Also given a dictionary. Find a transformation from a to b, such that: (a) each time you can changeone letter; (b) all the changed word should appear in the dictionary

    图的search问题,见crack the interview. 略…

 

89. 给定一个硬币集合{10,5,2,1},给定一个input amount,找出所有的硬币组合其sum可以等于这个数额,硬币可以被重复使用,就是说amount = 4, 集合可以是{2,2}.

    90. 集合的intersection, union

    TO LEARN

原创粉丝点击