声网C 音频一面二面(二面被教育及劝退全过程)

         这是我这个小菜鸡的第一次C++面试,在投之前只有一份.net的offer,但还是不想放弃找C++的工作。在面试前,做了一份笔试,笔试题:数据结构、操作系统、计算机网络各5道,C++基础8道,逻辑题和编程大题各两道。

一面:一面开始前不需要很多的介绍,直接开始了。

面试官:学过C++吗?那开始了

面试官:知道static吗?static的作用是什么?

答:static可以用来声明静态变量,存放在全局变量区,如果声明了static却没初始化,该变量默认初始化为0。static变量具有持久性,函数里的局部变量会在调用完函数后销毁,但static变量不会。在面向对象中,类中成员可声明为static,表示该成员属于类而不属于类创建的对象。

面试官:那static全局变量和普通全局变量的区别是?

答:没考虑过(应该是static变量有隐藏性,但没敢答)

面试官:extern“C”用过吗?有什么用?

答:C++源文件引用C源文件接口是,在接口声明时要加上extern“C”。

面试官:为什么不能直接引用?

答:因为同一个函数名,C++函数签名可能和C的不同。

面试官:具体有什么不同?

答:额,C++有函数重载,所以可能有多个同名函数,C无法识别?

面试官:下一个问题,说一下访问控制符的作用。

答:private是私有的,仅本类成员可访问;protected是保护的,类成员和类的派生类都可以访问;public是公共的。

面试官:如果有Class A,Class B,Class B: private Class A 会发生什么

答: B中继承A的成员都会被私有化,其他类包括B的派生类都不可以访问。

面试官:引用和指针有什么区别?

答:引用和指针本质上不同,引用需要绑定对象,指针可以指向对象。所以指针可以指向NULL而引用不可以为NULL,指针可以指向指针,引用不可以绑定引用。对指针的操作需要解引用,对引用可以直接操作,相当于操作被绑定对象本身。

面试官:所以你觉得,引用和解引用后的指针是一个东西?

答:不是,引用是对象别名,不占内存。

面试官:引用不占内存?编译器不为它分配空间吗?你确定吗?

答:看书本上说不占(实际上,编译器实现引用,确实是用指针的,占一个整形int变量的空间:4字节)。

面试官:C++的多态,说一下吧。

答:主要通过重载和重写实现的,重载有操作符和函数重载,重写父类的虚函数,我理解中,模板类模板函数也算吧。

面试官:等等,重载是如何确定使用的函数,重写呢?

答:传入的参数类型和个数可以确定,重写的话,子类的对象或者父类指针指向的子类对象使用子类的重写的函数。

面试官:那多重继承的情况呢?它的父类都有同名函数,而子类都重写了呢?

答:子类对象或者父类指针指向的子类对象都用子类重写的方法。

面试官:STL的vector如何实现?

答:模板类,声明成员数组,动态的扩容,每次扩容默认是以前容量的两倍,然后将扩容前的元素拷贝到新的内存空间,然后销毁原来的数组。

面试官:Map底层呢?底层在插入一个元素后的具体操作是什么?

答:Map底层是红黑树,额红黑树插入...

面试官:聊一下操作系统,进程和线程的区别

答:进程是资源分配的最小单位,线程是处理机调度的最小单位,切换进程的开销大于切换线程。

面试官:进程的虚拟地址是什么?

面试官:逻辑地址是什么?

面试官:说一下逻辑地址到物理地址的映射方式

答:不同的内存管理方式,映射的方式也不同。

面试官:说一下段页式的

答:段页式,先按段分,再按页分,段为了保证逻辑上的清晰,页为了减少碎片化。

面试官:为什么页能减少碎片化?

答:因为页式是离散的,而且页的大小是固定的。

面试官:现在在C++中,char *a = new char;系统如何为它分配段页式空间?

答:先根据段表,找到段号。

面试官:段号如何确定?

答:系统无法确定,编译器确定?

面试官:...死锁如何产生?

答:多个进程,申请的资源属于互斥资源,资源不可抢占,每个进程都处在保持与等待的状态并形成一个循环等待的队列。

面试官:如何防止和避免死锁?

答:防止,需要破坏必要条件中的一个或多个,避免死锁可以使用银行家算法。

面试官:介绍一下银行家算法

面试官:了解哪些进程调度算法?

答:FCFS,SJF,优先级调度等。

面试官:介绍一下有哪些优先级算法

答:固定优先顺序和高响应比等....

面试官:平衡二叉树是什么?

答:根节点到使用叶子节点的高度差不超过1.

面试官:插入之后如何平衡?

答:通过旋转,不同情况有不同的旋转方式(准备画出来想答时,已经下一个问题了)

面试官:反转一个字符串的方法

答:栈,双指针也可以。

面试官:没了吗?那今天就先到这里了

 

差不多一周后才开始二面,期间参加了国药控股的笔试和面试(居然还分无领导小组面和个人技术面),在电话里,面试官跟我说:我们这里没有C++的岗位,但是看你的履历,应该更适合.net的,而且有移动端的开发,你愿意转吗?(当然先拿着)

二面(直接被教做人)

面试官:你这个专业学过什么?

答:计算机核心的课程都有涉及的

面试官:那我们聊聊这些,交流一下

面试官:红黑树和平衡二叉树在效率有什么区别?

答:平衡二叉树的搜索效率更高,但红黑树插入和删除的维护成本更低,总体来说,红黑树效率更高。

面试官:为什么在红黑树更高,假设我现在有棵红黑树,一边全是黑节点,另一边红黑相间,你觉得搜索的效率的劣势可以被插入和删除的优势给抹平吗?

答:额,这是个极端的例子,但对于均匀的序列,的确是红黑树效率高。

面试官:具体高在哪里?

答:红黑树的规则比较容易达到,对平衡的要求低一点,而平衡二叉树的平衡需要的旋转步骤比较繁琐。

面试官:你的理解不够深入,你想想:对于一个均匀的序列,在统计里面,一般来说,是一个大一个小或者几个大的数跟着几个小的数,所以在插入平衡二叉树的过程中,一大一小的插入会让很多旋转变得浪费,而红黑树没有这种浪费,这就是红黑树在一般情况下效率更高的原因。

面试官:还是树,你会如何层序遍历一棵树?

答:BFS,使用队列来实现广度优先就可以了。

面试官:现在我需要你对一棵树的节点进行删除,要求从叶子节点向根节点开始删,你会用那种方法?为什么?

答:后序遍历,因为只有后序遍历的遍历顺序是先子节点再父节点,避免删除父节点后找不到子节点。

面试官:堆排序建堆的过程可以说一下吗?

答:堆是个完全二叉树,从最后一个非叶子节点开始,每个节点与自己的子节点比较,知道遍历到根节点,就可以建成堆了。

面试官:快速排序和堆排序为什么会比简单排序快?

答:快排的每趟排序都用基准值将序列分成两部分,所以用了分治法;实际上它每趟比较的次数都是n次,只是分开后,平均只需要比较logn趟,减少了很多不必要的比较。堆排序,我觉得完全二叉树也有这样的特性,所以可以减少比较次数。

面试官:你这么回答,就答得不好了,可以更清晰点,就像淘汰赛里,1/8,1/4决赛就是建堆的原理,很清晰知道减少了队伍与队伍间比较的次数。(这里确实觉得我和他要求的差距很大,但也让我理解更深刻了

面试官:B树查找效率是?

答:O(logn)

面试官:具体的底是多少?

答:阶数不同,底不同吧(我太无知了)

面试官:你没有想明白吧?书本没讲证明推理过程,我跟你推一遍:m阶B树,查找到一个节点的时间复杂度应该是m*log_{m}n,由于每个节点有m个元素,所以查找我们要用快的,二分查找log_{2}m,所以时间复杂度:m*log_{m}n * log_{2}m,这个高中的数学知识而已,得到log_{2}n,与m无关。

面试官:迪杰斯特拉算法介绍一下

答:单源最短路算法,可以用队列实现,每次都维护当前节点到源节点的最短路,不能在有负权的图中使用。

以上还算是有交流,接下来直接被教做人。

面试官:数据结构聊完了,一道C++,一道C,你来看看,告诉我输出。(我简直侮辱了C++)

C++:

class A{
pulic:
void f1(){
    printf("A::f1");
}
virtual void f2(){
    printf("B::f2");
}
}
class B{
public:
virtual void f1(){
    printf("B::f1");
}
virtual void f2(){
    printf("B::f2");
}
}
int main(){
    B obeject;
    A* p = (A*)&object;
    p->f1();
    p->f2();
    return 0;
}

C:

int func(int **p){
    p = (int *)malloc(512);
    return 0;
}

int main(){
    char *a;
    func(&a);
    strcpy(a,"Hello");
    printf("%s\n",a);
}

我的回答错了,确实没有研究过不继承的情况下,虚函数的用法。

面试官:你没理解到C++的真谛和精髓真的!(我也觉得)

面试官:操作系统,fork()的返回值介绍一下?

答:两个,一个父进程返回子进程的进程号,子进程返回0.

面试官:

int i = 0;
fork();
printf("%d\n",&i)

答:子进程会拷贝父进程的数据,但他们的数据空间不一样,地址不一样。

面试官:你根本没理解操作系统真正的内核原理呀。(实际上应该一样的,Linux下的“写时拷贝”...)

网络的就算了,socket内的读写的返回值我都说错真的没了,这里不提了。

由此可见,我看书真的不够,思考的真的太少,也没有对书本的知识进行实践。

你可能感兴趣的:(其他,面试)