【面试总结】Google Interview Phone Interview - wcq3692012的专栏 - 博客频道 - CSDN.NET
让我做一个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。
让我做一个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。
- 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)