您的位置:首页 > 职场人生

【面试】摩根暑期实习一面

2016-03-18 14:55 387 查看
今天算是正式开始了校招实习面试和工作面试,之后把所有的面试经历写下来,这也是一个成长的过程。

英文面试,一面很简单,二面要去上海面,貌似终面都要去上海。

面试官gg很nice,上来先让英文自我介绍,说实话,这个面试我一点都没准备,结果一上来自我介绍就懵了,偷看着简历念了一番。

之后问了几个简单的技术问题:

1、什么是c++多态(Polymorphism),以及实现原理(这是语言知识,会根据你简历上写的擅长语言问的)。幸亏当时看了英文版的a tour of c++,要不然都不知道Polymorphism什么意思。然后就解释了一下什么是多态,以及virtual function, virtual table那一套,有一个点要注意,virtual table是class级别的,而不是object级别的,c++所有member function都是class级别的,所以class的权限控制也是class级别的。这个可以看看Inside the C++ Object Medel这本书,基本上看完了,c++的各种对象模型都明白了。

2、给一个字符串,char* str = "aaabbbcccdef",去除掉重复字符,要求inplace操作,不要申请额外内存。注:这个题表述有错误,应该用char str[] = "aaabbbcccdef",应为"aaabbbcccdef"是常量字符串,直接附给char*编译器会优化,导致str[1] = 'b'这样赋值会出错,我当时看着不是很对,但是也不是很确定就没有指出来,后来回来试了一下果然错了。当然c++的话,肯定要写string啊,raw point能不用则不用。

一开始我用的copy

for(int i = 0; str[i] != '\0'; i++){
for(int j = i+1; j <= len;){
if(str[i] == str[j]){
j++;
}else{
copy(&str[j], &str[len+1], &str[i+1]);
len = len - j + i + 1;
break;
}
}
}


时间复杂度O(n),空间复杂度O(1)。但是这样后面的大部分重复也复制了,经提醒又写了比较简单的。

int i = 1;
for(int j = 1; str[j] != '\0'; j++){
if(str[i-1] != str[j]){
str[i] = str[j];
i++;
}
}
str[i] = 0;


时间复杂度O(N), 空间复杂度O(1)。但是我和面试官gg说这个版本和上个版本其实是没有区别的,因为str是plain data,在c++中plain data的copy是用c的memcopy函数,对于cpu来说,copy一个字符和copy一个block是没有区别的,面试官gg说是这样的,但是逻辑上来说第二种是比较好的。当然这个问题是很简单的,只是当时比较紧张,没想到第二种方法。

3、一个链表,怎么判断有没有环存在。如果有环,则找出环的开始点。

这个问题以及他的变形之前看过,所以很快就答出来,就是设置两个指针,一个走一步,一个每次走两步,如果两个相遇,则有环。之后另一个指针返回头头部开始走,每次一步,另一个指针从相遇点开始走,每次一步,再次相遇的点便是环的开始点,即相交点。

然后面试就结束了,总而言之,一面比较简单,可能二面会面比较难的问题吧。BAT的面试肯定比这个难,考察的知识面肯定也更广,数据库,设计模式,网路,操作系统,语言都会面到,更高端一点Google和hulu则是更难得数学和算法题。所以说还得好好准备,这个面试全部用英文,excited。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: