楼楼早上上午大概11点接到的电话,一个声音炒鸡好听的GG,说他是来自morgan stanley的,想和我约一下店面时间。我一听,真是戳不及防,掐指一算,online的IKE测试已经过去20几天了吧,有点小惊喜。我说下午亮点,GG说好哒。挂完电话之后,我就看电视剧去了,完全没放在心上。吃完饭后来同学才提醒,是英文的面试,我,这,一,下,就,慌,了。赶快写了个自我介绍,然后把几个关键词查了查就电话就来了。下面把问题都记录一下,攒RP。
GG:Hello, XXX. This is XXX…..balabala…主旨就是说下面面试会分为三部分。第一部分,我会快速地问你一些问题,然后你给出简要的回答,不要给例子,除非我问你。第二部分,我会问你一些你项目中的问题。第三部分,你看你有没有问题想问我,我会尽力回答,如果超出职责范围内,我后面会叫我的manager或者HR来回答你。总之就是很客气啦!
ME:好的。
GG1: 编译型语言和解释型语言有什么区别?Java是编译型语言吗?(翻译过来的啊,GG用的是比较流畅的英文,下面相同)
编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。
解释性语言:解释性语言在程序运行的时候才翻译,每执行一次就要翻译一次。因此,程序执行效率低,但是跨平台型好。
编译型语言适用于对执行效率要求高的系统,如操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。
注意Java是解释性语言,此处楼楼已跪,答错了,GG也没有提出来。
GG2: 二叉查找树(Binary Sort Tree)是什么?能简要介绍一下吗?
二叉查找树是指一棵空树或者具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
- 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 任意节点的左、右子树也分别为二叉查找树。
- 没有键值相等的节点(no duplicate nodes)。二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、Multiset和关联数组等等。
GG3: stack和queue区别是啥?
stack 是FILO,queue是FIFO
GG4: 指针是啥?
内存地址
GG5: 面向对象(Object Oriented)语言是啥?
我说的是,面向对象是一种思考问题的方法。是相对面向过程而言的,它有三大特性封装、继承、多态。能够使代码更好的重用,添加新的行为以及减少代码的耦合度。巴拉巴拉。。。
GG5: 刚刚你也提到多态,你能举一个例子说明一下多态吗?
我,举了一个不恰当的例子。人是动物,鱼也是动物,马也是动物,这三种动物都需要吃食物,但是吃的食物却都是不一样的。当我们把这些子类对象复制给父类对象的时候,匪类对象调用吃这个方法,系统就能动态的决定调用那个吃方法了。
GG6: 对象和类有什么区别?
对象是类的实例啊,只是突然忘记实例的英文,instance,嗯,就这个啦!
GG7: inline内联函数是什么?
当一个函数比较常用,比较短,但是又经常会被使用到,那我们就可以把这个函数定义成inline。函数代码被放入符号表中,在使用时直接进行替换,没有了调用开销,因此效率比较高。
GG7: 我临时想到一个问题,请问宏和内联函数的区别是什么?
参数检测:宏定义在编译的时候进行替换,但是仅仅是简单的替换,不会进行参数有效性的检测,它的返回值也不能被强制转换为可转换的合适的类型,使用时要非常小心。而内联函数是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数类型,保证调用正确性。
面向对象:当一个表达式涉及到类的保护成员或者私有成员,宏定义无法满足要求。inline可以用在面向对象里面。
GG8: 内联函数是不是always inline的呢?
不是。内联函数只适用于代码比较短的函数,inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如讲一个长达1000行的函数指定为Inline,编译器就会忽略这个inline,这个函数还原成普通函数。
GG9: 假设你上面说的是对的,那为什么编译器不这么做呢?
如果这个定义为inline的函数长达1000行,又有很多处被调用,那么代码膨胀带来的恶果很可能会大于效率提高带来的益处,所以编译器可能会选择忽略这个inline。
GG10: 如何访问一个类的私有成员?
我说getter,GG说,当然是没有getter的条件下啦,哈哈,被鄙视了。还有可以用友元啊,我尽然没说到这个,虽然可能面试官也不在于面友元,但多说一点总归会更好啊。这个问题,我查了一下,整理如下
访问一个类的私有成员:
- 友元(比说getter好,晕死)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#include<iostream.h>
class A
{
int t;
public:
A()
{
t=2002;//在构造函数中初始化成员变量t
}
friend class B;//声明友元类classB
};
class B
{
public:
A a;
int sum()
{
return a.t+1500;//友员class B访问class A中的私有成员变量t
}
};
void main()
{
B b;
cout<<b.sum()<<endl;
}
|
- 内存地址法
我们知道,C++编译器将数据和程序段分开,所有的类变量会按照声明顺序依次存入数据段,所以,如果知道了第一个变量的地址,那么后面的地址也就依次累加即可逐一求出了。有了变量地址,那么也就可以对它的值进行修改了。还是以上面的例子来说明,一下程序编写了如何更改类成员b的值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include <iostream>
#include <string>
using namespace std;
class center
{
public:
void setX(float _x){x=_x;}
void setY(float _y){y=_y;}
void setMeanValue(float avg){meanValue=avg;}
float getX(){return x;}
float getY(){return y;}
float getMeanValue(){return meanValue;}
center():x(0.0),y(0.0),meanValue(0.0){}
private:
float x;
float y;
float meanValue;
};
int main()
{
center A;
//普通青年的赋值方法;
A.setX(1.0);
A.setY(4.0);
A.setMeanValue(13.0);
cout<<A.getX()<<" "<<A.getY()<<" "<<A.getMeanValue()<<endl;
//文艺青年的赋值方法;
//*((float*)&A):将center对象A的内存空间强制类型转化为用int*指向的内存空间,访问该内存
float tmp = *((float*)&A);
cout<<tmp<<endl;//输出A.x的值
tmp = *((float*)&A + 1);
cout<<tmp<<endl;//输出A.y的值
*((float*)&A + 2)=2;//修改A.meanValue的值
cout<<A.getMeanValue()<<endl;
}
|
参考链接:
http://blog.****.net/yangtrees/article/details/8773508
我说可以用虚函数表,我搞混了,我看过可以用虚函数表的是这样一个问题,访问基类的私有虚函数。
额,不好意思,扯远了,我们看下一个问题哦。
GG11: 下面会问一些Unix或者Linux的基础问题。请问如何让一个进程在后台运行?
我说&。具体我查了一下,整理如下:
方法1在终端输入命令:
1
|
# ./pso > pso.file 2>&1 &
|
解释:将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。
当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命
令:#cat pso.file )。
方法2在终端输入命令:
1
|
# nohup ./pso > pso.file 2>&1 &
|
解释:nohup就是不挂起的意思,将pso直接放在后台运行,并把终端输出存放在当前
目录下的pso.file文件中。当客户端关机后重新登陆服务器后,直接查看pso.file
文件就可看执行结果(命令:#cat pso.file )。
GG12: 如何将一个在后台运行的进程移到前台来运行?
fg,将一个在前台运行的进程移到后台则可以用bg命令。如:
对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:
1
2
3
4
5
6
7
8
|
$ ./test.sh
[1]+ Stopped ./test.sh
$ bg %1
[1]+ ./test.sh &
$ jobs -l
[1]+ 22794 Running ./test.sh &
|
GG11及GG12参考链接:http://www.cnblogs.com/xianghang123/archive/2011/08/02/2125511.html
GG13: 如果一个进程已经在后台运行了,如何查看它的进程号?
ps -aux
GG14: 用过ps -es命令吗?
我说不好意思,没用过,差了一下,好像没这个命令啊,是我听错了吗?想要了解ps命令的同学可以自己查一查哈!
GG15: 如何列出所有使用某一文件的进程?
lsof filename
GG16: 不同主机之间如何拷贝文件?
scp
GG17: 什么是僵尸进程?
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
GG18: 什么是孤儿(orphan)进程?
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
GG17和GG18参考链接:http://www.cnblogs.com/anker/p/3271773.html
GG19: 孤儿(orphan)进程有没有PPID?
有,孤儿进程将被init进程(进程号为1)所收养,PPID就是1了。
GG20:孤儿(orphan)PPID是什么?
我说,parent’s processing ID,我估计他预想的答案是1,不过面试GG没有打断我,然后我觉得我简直是要被笑死了。
GG21:关于去摩根斯坦利实习,你的expectations是什么?
GG22:后面就是项目中的问题了,因人而异,就不多说了。
后面面试GG说虽然有点overtime了,但是还是问我有没有什么想问的。我没有问什么后面的流程什么的,我问他实话说,在摩根斯坦利上班,他开不开心,想没想过跳槽之类的。面试GG都很耐心地给出了回答,整个过程还是比较愉快的,面的问题都很基础,有点像快速抢答的感觉,整个过程持续38分钟。希望对大家有用,加油↖(^ω^)↗
另外博主的各位博客主页www.anycodex.com,每天都会更新,欢迎加入收藏,留言讨论!
http://www.anycodex.com/?p=102