说下基本规则:基本是45分钟两道题,基本一题20分钟。
要是一题半天都没有分析出来,就相当于这轮基本挂了。(要是想不出来,只能看面试官给你多少提示了--)
第一题:给一个大小为n的有序数组, 找出出现次数大于 n/4 的元素。
分析:我们一开始就能想到brute force的做法就是2根指针遍历,复杂度 O(n)。
但是不够优秀,面试官会问你better solution。那既然有序,又要降复杂度,我们就肯定想到了二分。但是怎么二分呢?
|--------|--------|---------|--------|
0 c1 c2 c3 n-1
这个数必然是 c1, c2, c3, nums[n-1] 中的一个。因为要求长度大于 n/4 啊~~~~
我们要从这几个candidate中判断那个是,就要判断从c1往左往右延伸的长度是否大于 n/4。这个左边界和右边界怎么求就是二分求啦。
我一般写 lower_bound, upper_bound, 但是二分怎么写要会呀。
第二题:Get Transitively Imported Files
想一下写程序的时候的头文件包含, 本题需要设计一个函数,返回一个文件所有包含和间接包含的所有文件。 set<string> getTransitivelyImportedFiles (string filename)
file1:
import file2;
import file3;
file2:
import file3;
file3:
import file4;
file4:
import file1;
给了一个函数:vector<string> getDirectlyImportedFiles(string filename), 这个函数直接返回一个文件直接包含的文件名。
eg: getDirectlyImportedFiles(file2) ---> {file3}
eg: getTransitivelyImportedFiles(file2) ---> {file3, file4, file1, file2}
题解:直接bfs。
follow up: 假设这个getDirectlyImportedFiles这个函数是api调用,会有比较大的网络开销,那么怎么办能加速呢?
面试的同学说多线程,每次把队列里面的都取出来,然后多线程调用这个api。这个多线程就可以说很多东西了, 大概说了几个名词和知识点。
countDownLatch, join, thread pool,
多线程的弊端:
(1)线程需要线程池管理,不然队列里面东西太多了,线程数太多的话,系统就挂了
(2)network congestion, 一台机器的socket连接数是有限的,太多了也有问题,我们虽然可以用multiplexing(多路复用)(一个socket)来处理这个问题。
那么follow up的正解是什么呢?
就是更改我们的getDirectlyImportedFiles这个api,把这个api的入参从单个string改成vector。批量取的接口。