- 一面——电话面,申请职位:Linux后端开发工程师
1.介绍自己,主要说明了网络管理平台的流量控制和调度算法;
2.Linux基本命令:awk,find,grep;
3.C++ virtual关键字,多态;
4.多集合找top n,利用堆的数据结构;
5.多路归并,加入自己的额外想法;
6.map和unordered_map的内部实现以及使用场合;
7.大数据查找,海量数据,如何查找整数k是否在其中(第一想法:bitmap,第二想法:基数排序分成小文件,缩小查找范围)
8.STL中vector的内部实现以及使用过程中需要注意的问题。
- 二面——现场,职位Linux后端
1.简要介绍自己,重点讨论了一下调度算法;
2.singleton(单例模式),注意线程安全;
3.对于线程安全谈一下自己的理解,如果让你自己去写一个类的话;
4.C++多态的实现方式,虚函数表+继承+指针/引用动态绑定;
5.面试官现场写了两个类A和B:public A,如下:
class A{
};
class B:public A{
};
1)首先问编译器会自动为A实现那些函数:
我的回答:构造函数,析构函数,拷贝构造函数,operator =,operator &
2)继续追问这样写存在的潜在问题:
我的回答:A作为基类,A的析构函数应该声明为虚函数virtual
3)进一步追问:在A类内部加上virtual ~A ()= 0;
即使A成为纯虚类,并且不实现析构函数,这样做会有问题么,
我的回答:最初认为没有问题,(面试官要求分析一下)但是想到编译完成,链接器执行链接的时候需要找~A的函数入口,编译是不会通过的。
6.比较简单的一道编程题目:
给定a,b,c三个数,和如下三个限制条件:
1).0<=a<=1.0,0<=b<=1.0,0<=a<=1.0;
2).递增步长step=0.5
3).a+b+c = 2
要求打印出所有满足情况。
我的回答:三重for循环枚举所有情况,满足时输出;
追问:步长可变的话程序应该怎么更改,
我的回答:加入参数step,使其作为输入使用,
追问:步长改为0.3,程序有什么能改进的
我的回答:没想到。。。
面试官:改为0.3就没有可行解了,直接跳出就行因为2.0无法被0.3整除,所以程序应该有一个预先判断;
7.简要说明一下自己对于分词问题的理解,并简述几种方法:
我的回答:首先说了一下动态规划分词的方法,另一种说了一下《数学之美》中介绍的统计分词;
8.如何使分词变得更为准确,如果用户输入A,B两个关键词,如何在索引中返回对应的查询链接?
9.搜索时出现同意词如何进行区分?