Tuesday, October 20, 2015

【面试总结】Google Interview Phone Interview - wcq3692012的专栏 - 博客频道 - CSDN.NET



【面试总结】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。
  1. char * ptr;  
  2.   
  3. bool move(char ** ptr_old, char ** ptr_target, int number)  
  4.   
  5. {  
  6.   
  7.  if (ptr_old + number < ptr_target)  
  8.   
  9. {  
  10.   
  11.  for (int i = 0; i < number ; i++)  
  12.   
  13.   {  
  14.   
  15.    * (ptr_target + sizeof(char) * i) = * (ptr_old + sizeof(char) *i);  
  16.   
  17.   }  
  18.   
  19. }  
  20.   
  21. else  
  22.   
  23. {  
  24.   
  25. for (int i = 0; i < number ; i++)  
  26.   
  27.   {  
  28.   
  29.   int offset = number- i - 1;  
  30.   
  31.    * (ptr_target + offset) = * (ptr_old + offset);  
  32.   
  33.   }  
  34.   
  35. }  
  36.   
  37.       return true;  
  38.   
  39. }  
  40.   
  41. //input:  
  42.   
  43. char char1 = ‘a’;//memory address 0x1  
  44.   
  45. char char2 = ‘b’;//memory address 0x2  
  46.   
  47. int number = 3;  
  48.   
  49. move ( char1, char2, number) 
Read full article from 【面试总结】Google Interview Phone Interview - wcq3692012的专栏 - 博客频道 - CSDN.NET

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts