【面试】摩根暑期实习一面
今天算是正式开始了校招实习面试和工作面试,之后把所有的面试经历写下来,这也是一个成长的过程。
英文面试,一面很简单,二面要去上海面,貌似终面都要去上海。
面试官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。