简单记一下今天的面试。
上来说自己叫穆罕穆德,好像不是个阿三,像是个中东的名字。
anyway,两分钟简单介绍一下自己,warm-up,这个没有想到啊。。。于是我说了说为啥来了这个学校,为啥喜欢programming,以后打算干啥,blabla,签证官都是回复good。
然后就开始technical了,让我做一个move 函数来move内存一个地址到另一个地址。这个我就开始懵了(看来刚才还木有warm up好)。我立即问,是int吗,是bit manupilation吗,他说都不是,再重复了一下题目,我还是很茫然,我寻思这不是hardware么,万万没想到啊!他又提示了一下,假设我有一个内存地址1,想把里面的内容move到内存地址2去,我说,那不就是用pointer么,他突然说:exactly!我恍然大悟原来是为了引出pointer,然后不由得自己也尴尬的笑了,我说大哥我真没反应过来,回头一想是应该考我pointer,因为是C++么。。。咋就想多了呢。。。
接下来我就开始写了,写成了new = old,然后他说这样会改变内存地址么?我说不会。。。我擦,真的是错的,于是我想了一下,写成了*new = *old,写完了检查完拼写他看了一会,没给正面回复,我反应过来在函数体内,应该pass pointer by value,于是加上了两个**。好吧,这回他终于说 good,我呼出了了一口气。
接下来,就问我要move a bunch of内存地址,该咋办,我说加一个number,然后他很高兴,于是我轻松的加上了for。之后,他说,这样会不会有问题,我说有啥问题。。他说“I'm telling you the codes may yield some part of the memory not copied." 我根本没想明白原来是有陷阱的。
下面跟他长时间的纠结在咋搞出问题的issue上了,我先是以为他要我做hand simulation,后来以为他要我生test cases,总之每一个是对的,猜了好久,他跟我说假设从1开始原地址,目标地址是4,但是我们要考皮5个内存地址,会发生什么呢。
我又恍然大明白了,原来是overlapping的错误,所以我想用tmp来缓存,他说如果不用呢?
我想了一想,说那么从后面往前copy,他说good,我就要写代码,他停止了我,接着问我,如果是目标地址在之前呢,meaning,目标开始在1,原地址开始在4,这样从5开始往前岂不是又要overlapping?我想是啊,这样的话那就从前往后copy好了。他说OKay,那你现在怎么办?
我想了一下说,那就用一个if-else判断呗。他说你怎么写if的条件,我想了想,我这时候跟他有一个短语上的歧义,于是我从新定义了一下overlapping的情况,这时候我脑子也清晰了,于是我说如果old_start + number < new_start,则没重叠,从前往后考,不然,从后往前,期待他的回复,他竟然说很好,你在making progress,那你开始写code吧。这时候我就放心大胆的写开了,然后写出来给他,他说非常好。
接下来就是有啥问题,我问了一下他平常的工作,然后就拜拜了。。
总结:
1,注重基础,连个pointer我想了大半天,没想到他考这么基本的。
2,要善于交流,学会用蹩脚的英语解释你的思路和code。
3,遇到发蒙的地方,他一般会给你提示,这是一个比较nice的interviewer。
以后还得多多做题,多多写code,真枪真刀的功夫不是盖的,不然人家让你扎个马步你就露馅了。
下面就是我写的最终的code:
char * ptr;
bool move(char ** ptr_old, char ** ptr_target, int number)
{
if (ptr_old + number < ptr_target)
{
for (int i = 0; i < number ; i++)
{
* (ptr_target + sizeof(char) * i) = * (ptr_old + sizeof(char) *i);
}
}
else
{
for (int i = 0; i < number ; i++)
{
int offset = number- i - 1;
* (ptr_target + offset) = * (ptr_old + offset);
}
}
return true;
}
//input:
char char1 = ‘a’;//memory address 0x1
char char2 = ‘b’;//memory address 0x2
int number = 3;
move ( char1, char2, number)