C++编程,数据结构,算法类面试题集.(2)

http://www.mianwww.com/html/2013/03/17814.html
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

91. Given an int n, print all the numbers which are less than n and in the following pattern: 1,4,5,9,14… Write a recursive program.

    看不懂…

 

92. How to sort a large collection of string?

    因为string的比较开销比较大,所以可以考虑用radix sort. 见138题, America flag sort问题

 

93. How to serialize a very sparse tree?

    保存parent->child关系

 

94. Given an arbitrarily long string, design an algorithm to find the longest repetitive substring. For example, the longest repetitive substring of “abcabcabc” is “abcabc”.

    TO LEARN. Suffix tree的应用

95. reverse a link list within each k blocks

    96. BST,排序双链表互相转换

    CODE

 

97. 字符表格找单词,比如下面的3*3字符表格
1  2  3
4  5  6
7  8  9
每一个位置都是随机生成的char,给你一个字典然后找到表格里面所有可能的单词.
单词的定义是任意个连续字符组合,一个位置用过之后就不能再用.

回溯, 略。。。

 

98. 给一个string,输出所有由这个sting中字符组成的所有可能strings。然后,如果有重复的字符怎么办。如果给你一个string, 和输出string长度,找出由这个sting中字符组成的所有可能string

生成子集的问题,略

99. 给一个log 文件,找最长session。session定义:同一个userid,两log间隔时间小于一小时

    不是很理解,用map<userid, list<time>> 来记录用户的登录时间,然后再扫描?

 

100. 不用乘法实现两数相乘 m*n, O(lgn)

    101. 一个返回所有n比特格雷码的函数vector<int> getGrayCode(n) 比如 getGrayCode(2), 应该返回{0,1,3,2}

    略。。。

 

102. 两个sorted array A,B, 问能否从A,B中各取且只取一个数,是他们的和为x

从两头scan, 略

103. 一个数组有N个元素,都大于0.将数组分成K段,求使最大的每段数组和的最小值

初始条件: f(x,y,1) = a[x] + … + a[y]

递推: f(1, n, k) = min(1<=i<=n+1-k)max{f(1,i,1),f(i+1,n,k-1)}

    该问题的一个变体是: 有一个包括N个整数的数组,求k个数,使得这k个数排序后,相邻两个数的差的最小值最大。

先将数组排序

初始条件: f(x,y,2) = a[y] – a[x]

递推: f(1,n,k) = max(2<=i<=n+2-k)min(f(1,i,2), f(i,n,k-1))

 

104. 判断某个点是否在多边形的内部。按逆时针方向依次给出多边形的所有顶点。

    图形学,考虑依次形成的所有夹角的和,如果在内为2pi, 否则为0

 

105. 判断一个set里是否有四个数的和等于一个target number.
    预先计算所有两数之和,得到map<sum, vector<pair<index1,index2>>>

然后再这个map中搜索有没有和为target number的pair(并且index不能重复),时间和空间复杂度O(N^2).

另外一种做法是当成子集合问集,按target number(T)做DP,复杂度O(NT)

 

106. how to implement priority queue (describe) ?

    用最大/最小堆来实现,堆的heapify操作

107. 找到数组中的第二大的元素

    108. 两个人(A,B)参与一个游戏,规则如下:
1)一个随机的整数数列有偶数个数,a1,a2,…a2n
2)A先从数列取数,但只能从两头取,a1 or a2n
3)然后B取数,也是只能从剩下的两头取,依此类推,两个人轮流,都只能从两头取
4)最后谁手里的数和最大赢。

先拿的人有必胜策略,把所有的数按在奇数位和偶数位分成两组,则先拿的人可以选择拿到所有奇数位或者所有偶数位的数。
用DP求最后能拿到的最大的和:
设v[x,y]是当某人在数列剩下x到y位时,能拿到的最大值,n[x,y]表示需要拿的位置(x或者y)则

初始化: v[x,x] = a[x], n[x,x] = x

递推: v[x,y] = max(v[x] + (v[x+2,y]或者v[x+1,y-1], 由n[x-1,y]决定),

v[y] +(v[x,y-2]或者v[x+1,y-1],由n[x,y-1]决定))

n[x,y]由上一步取v[x]还是取v[y]决定。

 

109. 最大回文的详细解法

    Suffix tree的应用, TO LEARN

 

110. 假定有个graph,怎么找出不带circle的最长path

    有向无环图可以用DP解,一般情形下是NP完全问题

算法:

algorithm dag-longest-path is

    input:

         Directed acyclic graph G

    output:

         Length of the longest path

 

    length_to = array with |V(G)| elements of type int with default value 0

 

    for each vertex v in topOrder(G) do

        for each edge (v, w) in E(G) do

            if length_to[w] <= length_to[v] + weight(G,(v,w)) then

                length_to[w] = length_to[v] + weight(G, (v,w))

 

    return max(length_to[v] for v in V(G))

 

111. 关于外部排序

一般做法:

将输出数据分成K份,使得每一份都能放到内存中排序,然后将每一份排好序后写到文件
从每一份排好序的数据中读一部分到buffer,对buffer中的数据进行K-way merge后写到最终的文件。(这里存在一个多路归并的开销,和反复读取文件的开销的权衡)
如何改进性能:
a)   使用多块磁盘同时进行读/写

b)   使用多线程提高内存里的sort的性能

c)   使用异步的IO使sort和磁盘读/写同时进行

d)   多机的并行(map reduce ?)

e)   如果key较大,则可以使用radix sort提高速度

 

112. 正态随机

    http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution

根据中心极限定义,一种简单的做法是,生成2N个(0,1)之间的随机数,然后将它们的和减去N,得到一个近似正态分布的数

 

113. 实现linkedIn里查找两个人之间connection的功能。(如果每人有100个熟人,假设任何两个人之间只隔6个人,需要space 100^6,内存放不下。所以改用同时从两边bfs, 需要space 2*100^3)

    略。。。

 

114. 两个Sorted Array,找K smallest element, array1 长度M,array2长度N,要求O(logM+logN)

    见68题

 

115. [Facebook] Given a string and a dictionary that maps a character to several
characters, print all combination and tell the complexity.
i.e., string = “face”, f=> f, @, 4, h     a=> a, c, e
print: face, @ace, 4ace, …..

    116. Merge sort linked list.

    略。。。

    详见http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html

    Merge sort linked list的特点:不需要额外空间,时间复杂度O(NlogN),并且是stable的

 

117. example:
char *words[] = {“foo”, “bar”, “baz”, NULL};
setup(words);
1) First step:
isMember(“foo”) -> true
isMember(“garply”) -> false

2) Second step:
isMember(“f.o”) -> true
isMember(“..”) -> false
*/

1. 用map即可。。。

2. 需要对words里面的每一个elements依次匹配。为了加速,可以预先对words构建一棵字典树。

 

118. Given an integer, print the next smallest and next largest number that has the same number of 1 bits in their binary representation.

xxx011100 -> xxx100011

从右往左扫,将第一个在1后面出现的0置1,xxx011100 -> xxx111100
将这个1后面的1置0, xxx111100 -> xxx101100
将剩下的1放到最右边,xxx101100 -> 100011
CODE略

 

119. 一个有n个整数数列,如果有符合下面条件,就返回1,如果没有返回0.

要求:a[i]+a[j]>a[k]; a[i]+a[k]>a[j]; a[j]+a[k]>a[i]

先排序,再比较相邻的三个数即可

 

120 很长很长的string/file, 要我找出中间重复次数最多的character, character set
可能是任何char set, unicode. (map reduce, multi-thread)

    TO LEARN, 写一下用map reduce 怎么做

121. [Apple] You are given a deck containing n cards.  While holding the deck:
1. Take the top card off the deck and set it on the table
2. Take the next card off the top and put it on the bottom of the deck in your hand.
3. Continue steps 1 and 2 until all cards are on the table.  This is around.
4. Pick up the deck from the table and repeat steps 1-3 until the deck is in the original order.
Write a program to determine how many rounds it will take to put a deck backinto the original order.  This will involve creating a data structure to represent the order of the cards. This program should be written in Python.  It should take a number of cards
in the deck as a command line argument and write the result to stdout.

    略。。。

 

122. Suppose there is a binary tree having millions of nodes and by mistake one node has two indegree (i.e. There becomes a cycle/loop in that tree. Tou have to find that node which is having two indegree) Constraint is no extra memory can be used and tree representation is in Linked list format.

???可能吗?没有额外memory, 否则做个DFS/BFS即可

 

123. Print the nodes on the exterior of a binary tree in a anti-clockwise order, i.e., nodes on left edge, then leaf nodes, then nodes on right edge.

    先按层遍历,将每一层的开始放到left edge, 结尾放到right edge. 再中序遍历打出所有的leaf node(这里取决于leaf node的定义), CODE取自:

http://www.leetcode.com/2010/10/print-edge-nodes-boundary-of-binary.html

124. 已知整数 m ,其二进制形式有 k 位为1,打印出 0≤x≤m 所有满足以下条件的 x
x^(m-x) = m,其中^是异或运算符。在 0≤m<2^n 范围内对每一个 m ,打印出所有的 x ,并求总复杂度。

TO LEARN, 像数学题

125. You can win three kinds of basketball points, 1 point, 2 points, and 3 points. Given a total score X, print out all the combination to compose X. (recursion/ Dp)

略。。。

 

126. 有n个job,分配给3个打印机,求所有任务完成的最短时间。例如:3,5,4每个打印机占1个job,最短时间是5. 15,7,8,10, 4, 15给1号打印机,7,8给2号打印机,10,4给3号打印机,最短时间是15.

http://en.wikipedia.org/wiki/Partition_problem

    见133题

127. 设计一个算法,判断一个integer n是不是可以表示成k(k>=2)个连续正整数的和

    假设所要分解的数为x ,分解成n个数,那么我们可以这样表示:

x=m+(m+1)+(m+2)+……….+(m+n-1)

其中m为分解成的连续整数中最小的那一个,并且我们知道m大于等于1的正整数。易知:

x=(2m+n-1)*n/2, 变换一下的m=(2*x/n-n+1)/2

由m的范围我们知道(2*x/n-n+1)/2>=1 以上就是x和n的关系。给定一个n看是否x能分解成n个连续整数的和可以判断是否存在m,也就是转换成(2*x/n-n+1)是否是偶数。

代码略

128. how to serialize and deserialize a n ary tree?

见79题

129. 如何刷屏最快

    G(n) = max{G(n-1)+1, g(n-k)*(k-2)}

130. Given a sorted array with duplicates and a number, find the range in the form of (startIndex, endIndex) of that number. For example, given 0 2 3 3 3 10 10 and 3, return (2,4). Given the same array and 6, return (-1,-1).

    Binary Search的扩展,见142题

 

131. 有N个整数,M个bucket,每个bucket都可以装至少N个整数,一个bucket的value等于放入它的所有整数的和。现求解一种分配方法,使之 minimize(the max value of all buckets)

NP完全问题,见:

http://en.wikipedia.org/wiki/Job_shop_scheduling

132. Given pairs of connected items ((A, B), (B, C), (C, D)…), find the root
node of this tree.

    找到入度为零的node即可

133. There’s a book and each sentence consists of several words. How to find the minimal set of words which can used by the reader to understand half of total number of the sentences. Each sentence is readable if the reader knows all the words.

TO LEARN, 有点类似于dancing links用到的满足问题

 

134. [facebook]求一段时间内出现最多的ip address(es)

    只能是搞几张aggregate表,按秒,分钟,小时等做为粒度。。。

135. 两个文件里面存着行程安排,开始时间以及结束时间,设计算法找所有conflicts。

    如果要找所有conflicts, 则复杂度为O(N^2), 略。。。

136. what’s the best data structure for storing and looking up a huge amount of url’s (presented in a prefix format) like these:
com.google.www -> value1
com.yahoo.finance -> value2
com.yahoo.finance/stocks -> value3
com.yahoo/finance -> value2
1.2.3.4/node/123 -> value4
….
the requirements are:
1.  it has to be compact (compression if necessary).
2.  lookup time should be fast (constant would be ideal, but a few level of tree lookup is fine too).

    有点类似于设计题,可以用一个优化过的prefix tree?

 

137. Subset sum problem

可以转换为背包问题

   

138. Dutch National Flag Problem (DNFP)

http://www.iis.sinica.edu.tw/~scm/ncs/2010/10/dutch-national-fl

    如果有多于三种元素,则称为America Flag Problem, 本质上是radix sort

139. 一个单词的列表,要找出两个单词,它们没有相同的字母出现,而且长度乘积最大

    难题, TO LEARN

140. You are given N blocks of height 1…N. In how many ways can you arrange these blocks in a row such that when viewed from left you see only L blocks (rest are hidden by taller blocks) and when seen from right you see only R blocks? Example given N=3, L=2, R=1 there is only one arrangement {2, 1, 3} while for N=3, L=2, R=2 there are two ways {1, 3, 2} and {2, 3, 1}.

    DP题,定义g(n,l,r)为题目的答案,而f(n,l)为n个block,从左边看到l个block,则递推公式为:

g(n,l,r) = (1<=k<=n)sum(C(n-1,k-1)*f(k-1,l-1)*f(n-k,r-1))

f(n,l) = (1<=k<=n)sum(C(n-1,k-1)*f(K-1,l-1)*(n-k)!)

f(n,1) = (n-1)!

F(n,n) = 1

F(n,m) = 0 if n < m

你可能感兴趣的:(数据结构,编程)