# 群暉 Product Developer (溝通平台軟體開發) ## 第一關 2020/06/03 ### 流程 因為疫情關係,第一次面試為透過skype面試,自我介紹時提到我自學資料結構、演算法和作業系統,面試官就對這幾項問問題,考基本觀念,大部分為OS觀念(請一定要把自己履歷提到東西練熟~)。 問完過後開始考白板題,題目是演算法走迷宮(很基本的),但完全沒碰過,所以不知從何下手,直接用迴圈去做條件判斷,所以寫很久也沒解出來QQ,但是還是很認真地亂掰亂分析,結果寫了50分鐘。 ### 線上白板題 給予一個二維(m,n)矩陣,內涵0,1,0不能走1可以走 判斷是否可以從(0,0)走到(m,n) ```cpp= int Maze(int* a,int m, int n){ int dp[m+1][n+1]={0}; dp[0][1]=1; for(int i = 1; i <= m; ++i){ for(int j = 1; j <= n; ++j){ dp[i][j] = (a[i-1][j-1] && (dp[i-1][j] || dp[i][j-1])) ? 1:0; } } return dp[m][n]; } ``` ## 契機!! 2020/06/04 原本以為第一關考得很爛沒什麼機會,結果隔天就收到二面通知,當時因為拿到原本第一志願的Offer(IC韌體),沒有很想去二面,也畏懼更難的白板題,於是婉拒這次二面 BUT 竟然激起主管興趣,打來跟我聊天快一小時,介紹自己分本科畢業,一開始也是先做IC韌體,後來才走純軟,分享自己的心路歷程,給我很大的鼓勵,所以又有二面了。 ## 第二關 2020/06/09 ### HR 半小時HR面試,聊天聊自己,沒有特別的重點。 ### 主管 兩位主管進來,一位是當天跟我通過電話的,前面快速的話家常後,重頭戲來了,白板題!! 會議室的牆壁就是白板,寫的時候可以跟考官討論(很重要),一些忘記的指令也可以詢問,題目在下。 #### 魔法氣泡 **題目** 一個12x6的二維vector裏頭,有四種顏色,分別用1~4表示,0表示沒有。 氣泡從上面掉下來,同顏色相連累積超過四個就會消除,可以直、橫、分岔都可以(不重要)。 消除過後上面會垂直掉下來,達到消除條件會繼續消除,直到整個牌面都沒有可以消的為止。 **思路** 設定一個二維vector,由6個長度12的vector組成,vector [0]的位置在最下方,氣泡由末端[11]開始掉下去。 main主程式: 遍歷每格對其check,達到消除條件進reZero,遍歷後進行一次下降down,這樣為一次循環,如果遍歷完沒有任何一格達到消除條件,則完成最終牌面,回傳False。 reZero: 對於達到消除條件的數值更改為零。 down: 對一維vector從前面開始若有0則後面補上。 ```cpp= struct point{ int x; int y; }//座標 vector<point> check(vector<vector<int>> &board, int x, int y) { ... } //他給的已完成function,丟入(x,y)座標,可以檢測出與當下座標顏色相同的且連線的其他座標 ``` 以上為他給的條件,要求給予一個尚未消除過的board,回傳消除過後的board ```cpp=+ vector<vector<int>> MagicBubbleMain(vector<vector<int>> &board) { while(main(board)) ;//當main回傳False時,表示消除完畢 return board; } bool main(vector<vector<int>> &board) { //設定結束條件 bool T = false; //雙重迴圈,對每一個做check for(int i = 0; i < 6; ++i){ for(int j = 0; j < 12; ++j) { vector<point> p1 = check(board, i, j); //達到消除條件,進行消除reZero,並更改結束條件為true if(p1.size() >= 4) { reZero(board, p1); T =true; } } } //如果有消除則牌面下降,補齊空格 if(T) down(board); return T; } //將被消除氣泡令為零 void reZero(vector<vector<int>> &board, vector<point> &p1) { int size = p1.size(); for(int i = 0; i < size; ++i) board[p1[i].x][p1[i].y] = 0; } //將被消除的空位,下降補齊 void down(vector<vector<int>> &board) { for(int i = 0; i < 6; ++i){ for(int j = 0; j < 12; ++j){ if(board[i][j] == 0){ int k = j; while(k < 11) board[i][k] = board[i][++k]; board[i][11] = 0; } } } } ``` ### 大大主管 一進來就直接給口頭offer,這讓我超級震驚!! 簡單聊過並給予一些鼓勵與期待,還發現是南一中的學長,一路上都被學長們照顧~ ## 心得 經過這兩次的白板題後,有大概抓到一些心得 1. **思考邏輯** 白板題是針對個人去設計的,在你擁有的知識下去考,且不會是容易在網路上找到的題庫,所以目的不在於答對,而是重在觀察你思考的過程,怎麼去分析問題,並能將其轉換成程式的能力。 2. **平易近人的程式** 請盡量讓自己的程式具有清晰易懂的能力,不一定要效能多強,或是程式碼越短越好,而是要能清楚表達每個function的功能,但這真D難哈哈 3. **不要讓你的考官睡著** 要不停的跟他討論X(喇賽O),讓他很有參與感,不斷講解自己現在的步驟,還有下一步要幹嘛,總之不能讓場面乾掉,這就是白板題的精隨。 --- ## 工作內容 mail相關程式開發及維護,使用C++/Java script ###### tags: `面試`