面經:Google兩輪背靠背


如題,谷歌兩輪背靠背電面。兩輪都是廢話不多說直奔coding,雖然第一輪的中國大哥還是花了一點點時間了解了一下我的背景、畢業時間、research方向。說好的research面呢?

中國大哥出的題:

Given a set of integers, print out all the subsets
For example, {1, 2, 3}
output: {}, {1,2}, …., {1,2,3}

我的解法:

 1 public ArrayList<ArrayList<Integer>> findsubsets (int[] S) {
 2     Arrays.sort(S);
 3     ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
 4     ArrayList<Integer> set = ArrayList<Integer>();
 5     for (int i=0; i<S.length(); i++) {
 6         helper(set, res, S, i, 0);
 7         }
 8         return res;
 9 }
10 
11 public void helper(ArrayList<Integer> set, ArrayList<ArrayList<Integer>> res, int[] S, int i, int starter) {
12     if(res.size() == i) {
13         res.add(new ArrayList<Integer>(set));
14         return;
15         }
16         for (int j=starter; j<S.length(); j++) {
17         set.add(S[j]);
18         helper(set, res, S, i, j+1);
19         set.remove(S[j]);
20         }
21 }
22         
View Code

問的問題我大概十分鍾寫出來,但是花了二十分鍾給他講懂。他先沒懂。一直在糾結這個Recursion最后怎么終止的,舉了個例子比如length=10, starter=8, i=5, 我跟他說這個循環自己就會終止,因為starter始終無法超過s.length,當starter到了s.length, 自然就終止了。他最終懂了,說是對的。這樣就過了30分鍾,我讓他趕緊進下一個問題,他說沒太多時間了,就不問了,各種瞎聊,我問了各種問題,從PhD的要求到谷歌的文化。最后實在沒可聊的了,就讓他出了一道題,我大致講了一下方法。

Given A list of books in a library, sorted in a predefined order. Books have height {h1, h2, h3, …. hn} and assume all books have thickness 1.
Arrange them on bookshelves that can hold k books at most on each level. The height of each level is the max height of the books on that level.
Find out the minimum total height of all the bookshelves necessary to accommodate all books.

我大致講了貪心算法和DP的思路,沒時間了。他最后的評價是:Generally, what you did is ok. For future you still need more practice, for fulltime job.

第二輪上來的印度大哥口音實在是。。。他沒一個問題我都要他寫下來。

第一個問題:Write a function to return a copy of a list with duplicates removed.

我問了他好一些問題,比如是不是LinkedList, 還有這個list是不是sorted,還有比如11123,是刪成123呢,還是23. 然后就是什么樣算是Copy,把這些都搞清楚了之后,我給他講了大致的方法:O(N),從前到后Scan,每次不重復就把node value存到一個HashSet里面,然后拷貝這個點到新的List里面,代碼如下:

 1 public Class ListNode {
 2     int val;
 3     ListNode next;
 4     ListNode (int x) {
 5     this.val = x;
 6     this.next = null;
 7 }
 8 } 
 9 
10 
11 public ListNode copy(ListNode head) {
12     if (head == null) return null;
13     HashSet<Integer> set = new HashSet<Integer>();
14     ListNode dummy = new ListNode(-1);
15     ListNode cur = head;
16     ListNode runner = dummy;
17     while (cur != null) {
18     if (set.contains(cur.val)) {
19     cur = cur.next;
20 }
21 else {
22     ListNode newNode = new ListNode(cur.val);
23     runner.next = newNode;
24     set.add(cur.val);
25 }
26 }
27 return dummy.next;
28 }

有點小錯,比如23行,我忘了移runner了,不知道考官發現沒有。這一輪狀態不是太好,還有電面我不是太喜歡,不說話總感覺冷場,感覺沒機會好好把問題分析透徹。他就問了個問題:Does it preserve the order of the original list? 我給他解釋了。他說Java有的interface可以直接用,或者自己定義,我說我prefer自己定義的。

第二個問題:Find max of an strictly ascending then strictly descending array.

我先給了個O(N)的naive算法,他問能不能提高,我說可以用O(logN)類似binary search的方法,用 Recursion來做,每次取whole array的中點,取名a1, 把array一分為二,取前一個array的中點,取名a2, 后一個array的中點,取名a3. 然后比較a1,a2,a3大小關系:

1. 如果array[a1] > array[a2] && array[a1] > array[a3] (我開始的時候比較index去了,后來自己發現了,改了),說明max在 a2, a3之間,下一次recursion進這個range

2. 如果array[a1] > array[a2] && array[a1] < array[a3], 說明max在a1右側(我開始講成a3右側了,他讓我再想想,我一下子反應過來了)

3. 如果array[a1] < array[a2] && array[a1] > array[a3], 說明max在a1左側

這是我考場想到的情況所有情況,我問他怎么看,他think that's it. 電面果然不容易想清楚所有情況,下來想想,其實第2種情況應該是array[a1] > array[a2] && array[a1] <= array[a3],第3種情況應該是array[a1] <= array[a2] && array[a1] > array[a3],但是臨場那種緊張情況下我確實想不到那么多細節了。臨場寫下的code如下:

 1 public int FindMax(int[] array) {
 2     if(array == null || array.length < 2) return -1;
 3     return helper(array, 0, array.length-1);
 4 }
 5 
 6 public int helper(int[] array, int l, int r) {
 7     if (l >= r) return array[l];
 8     int a1 = (l + r) / 2;
 9     int a2 = (l + a1) / 2;
10     int a3 = (a2 + r) / 2;
11     if (array[a1] > array[a2] && array[a1] > array[a3]) {
12     return helper(array, a2, a3);
13 }
14 else if (array[a1] > array[a2] && array[a1] < array[a3]) {
15     return helper(array, a1, r);
16 }
17 else {
18     return helper(array, l, a1);
19 }
20 }

第7行的停止條件最開始忘了,他問這個Recursion怎么停止,我才發現忘寫base case,立馬加上,在提醒下改正錯誤,不知道這扣不扣分。然后第3行s.length-1忘-1. 哎,小錯不斷啊。最后他讓我舉個例子推一推:

1 2 3 4 5 4 3 2 1 
0 1 2 3 4 5 6 7 8 

helper(0, 8)
a1 = 4     5
a2 = 2        3
a3 = 6        3

helper(2, 6);
a1 = 4        5
a2 = 3        4
a3 = 5        4

helper(3, 5)
a1 = 4        5
a2 = 3        4
a3 = 4        5

helper(3, 4)
a1 = 3
a2 = 3
a3 = 3

因為之前的=錯誤,我推到后面有點不對,正在想辦法改,考官說

I'm sorry to cut the interview abruptedly. I didn't realized that I will lose the conference room at 3:45 sharp. Thank you for applying for Google. You should hear from your recruiter in a week or so. Have a nice day!

 好吧。。第一次用google doc電面,多少還是多少有點不適應。然后電面這種模式感覺沒有面對面的時候更放得開思維廣一點,有時候空對空更不容易跟面試官講清楚自己的做法。總的來說,第一輪第一題應該沒什么問題,第二題是我自己要來的,隨便講了講思路,大致方向(greedy和DP應該是對的)。第二輪第一題忘了runner指向下一個了,不知道面試官發現沒有(有時候就在想,他們發現問題了是跟你指出看你發現沒有呢,還是嘴上不說心里默默記下該扣分了?)第二題想到這么多我也是盡力了,=的情況確實在當時那種心理狀態下沒想到無可厚非。以后還要加強這種Corner Case思考的訓練。然后寫的時候,出了兩個小錯,在他提醒下改正了。他最后的評價是:You did mostly correct.

哎,人事已盡,成敗看天..祈禱

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM