技术面试1(大概45分钟左右)
进去先是聊天,面试官说他以前也是浙大的,比较亲切。然后问了聊了下我的考研情况,为什么决定第二次考?第二次准备考试的时候是如何提高你的英语水平的?(我和他说了第一次英语没过线)。然后让我介绍了一下在公司做的项目(我工作过3个月),在这个项目中你遇到过什么印象比较深刻的问题?是如何解决的?
然后是15分钟写代码。写一个函数实现如下功能:向该文件读入一个文件,统计文件中每个单词的出现次数,并以标准输出流的形式显示出来。我是用Map实现的,思路很简单:就是每读入一个单词,判断在Map中是否有该元素,如果有则将该单词对应的Value值加一,如果没有则将该元素加入Map中。写好之后给他看,指出了我的代码中存在的一大堆问题:
(1) 没有包含头文件;
(2) 函数类型最好是bool的,而不是void的类型;
(3) 这样把标点符号也作为一个单词来统计了,不大符合题意;还有一些想不起了。
接着是很多的扩展性问题:
Q:如果文件很大,内存是放不下的,所以不能以标准输入流的形式来读入文件,这时候该怎么办?
A:可以把该文件分成多个小的文件,然后分别处理,最后再做一个二次统计。
Q:那按你的实现方法,做二次统计的时候会遇到什么样的问题?
A:可能该文件的关键字很多,导致Map中放不下那么多的关键字;
Q:那怎么办呢?
A:在分割文件的时候做处理,按字典序来分割文件,比如首字母为a的单词放到一个文件中,这样来做文件;
Q:这样分割之后你有什么样的方法来提高你程序的效率?
A:可以用多线程,不同的文件同时处理,而且他们之间也不用同步互斥,所以实现起来会相对简单点。
Q:如果这样处理,速度的瓶颈出现在什么地方?
A:应该是CPU的处理速度吧。。。。
Q:不对,应该是对磁盘的访问,多个线程要求同时访问磁盘的时候,其中一个必然要阻塞。有什么解决办法么?
A:把他们放到不同的磁盘上应该就可以了吧。
Q:对,这个就是所谓的分布式计算了,这其中会遇到很多问题,比如其中一个磁盘坏了怎么办?不同磁盘如何实现信息的通信。(啪啦啪啦讲了好多。。。。)
第一面结束。