原来投的是软开,一面面试官人很好,在面的过程中说我有运维的潜质和相关的实习经历建议我也去运维那边了解了解,所以在一天之内就参加了软开一面,运维开发一二三面。下面总结一下面试中出现的一些题目吧。
1. 有一个整型数组a[],大概装有1亿个整数范围从1到1亿,乱序排列,如何快速得到排序状态下的第60W到70W之间的数。
此题目一开始理解错误以为要求得60W到70W之间大小的题目所以采取bitmap的形式。要在不排序的情况下得到下标60W到70W的数的话,只有在数组中数字不重复的情况下才可以找到比较好的方法,先缩小范围,再得出精确答案。
2.一个单词单词字母交换,可得另一个单词,如dog->god,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程 。
使用hash_map和链式存储。
首先定义一个key,使得兄弟单词有相同的key,不是兄弟的单词有不同的key。例如,将单词按字母从小到大重新排序后作为其key,god和dog的key都是dog,按字母排序。
使用链表将所有兄弟单词串在一起,hash_map的key为单词的key,value为链表的起始地址。
开始时,先遍历字典,将每个单词都按照key加入到对应的链表当中。当需要找兄弟单词时,只需求取这个单词的key,然后到hash_map中找到对应的链表即可。
这样创建hash_map时时间复杂度为O(n),查找兄弟单词时时间复杂度是O(1)。
3.有20个数组,每个数组里面有500个数组,降序排列,每个数字是32位的unit,求出这10000个数字中最大的500个。
建立500个数的小根堆。
4.有25匹马,5个跑道,没有任何秒表在内的辅助工具,且马每次跑的速度都一样,怎样用最少的次数求出跑得最快的5匹马。
和上一题的模型类似,只是这个要给出具体的比较方法,且不同的马不赛跑就无法进行比较。
5.有140g面粉,一个天平,一个2g和一个7g的砝码,如何测量三次分出50g和90g面粉。
6.二叉树重建、快排、二叉树遍历。