發表文章

[面試心得] GoFreight / 聖學科技(Freight Forwarder) - Full-Stack Engineer

零面. Hacker Rank (120 min) 5 題 Hacker Rank,難度約 2 題 Easy 2 題 Medium 1題 Hard, 第 1 題: 算 duplicate 個數,解法: Hash Table O(1) 第 2 題: Smallest window that contains all characters of string itself,解法: Sliding window O(n) 第 3 題: Sort 之後取前 n 大加總 (英文閱讀測驗? ),解法: std::sort O(n log n) 第 4 題: Minimum increment to make array unique,解法: sort O(n log n) 第 5 題: Connected component,解法: DFS O(|V| + |E|) 運氣算蠻好的,Hard 那題感覺實際只有到 Medium 而已,Medium 的也都算簡單, 全部寫完還有約 40 ~ 50 分鐘,網站測資都有過,不知道實際分數就是了 XD 一面. 遠端 第一場 1hr. 1 位考官 這關是純白版題,估計是怕有人 Hacker Rank 找代打 XD  題目是四則運算,輸入 3 + 5 * 4 的字串 (無括號),輸出 23, 看到題目很直覺告訴考官是後序,但尷尬的是老早忘記細節怎麼做 ... 冏 於是考官請我先不要管後序,想先看看我撇開前中後序下會怎麼寫, 於是就先使用直覺的方法做出一個很醜的演算法, 接著考官又加入括號問我要怎麼做,原本想繼續用很醜的方法寫, 但寫一寫發現括號會遇到的問題比較麻煩,最後就回想後序做法,最後用後序完成 ~ 第二場 2hr. 1 位考官 (應該是技術長?) 這關就不再考算法了,先自我介紹之後針對履歷開始逐一詢問, 除了針對履歷外也詢問了很多 GoFreight 會用到的技能, 如: Python2/3 差異 (range, list/tuple, unicode ... 等),Hash 碰撞如何處理,Browser 瀏覽網頁時整個 request 的流程 (load balancer, nginx ... 等),js 放在 header / body 差異 ... 等等, 不得不說考的內容蠻詳細的,也會針對你提出的解法做進一步追問, 最後考官會接著

[面試心得] VICI Holdings / 威旭(高頻交易) - Software Engineer

  零面. 作業   作業很簡單,寫一個計算日期A到日期B之間有多少天數的程式。 一面. 現場 先考筆試,筆試題目類型很廣 (如 Pointer, Sizeof, Structure padding, cache line, race condition ...), 筆試寫完之後接著就是技術面談, 詢問我之前在聯發科做的一些題目,例如: 如何讓效能提升好幾倍? 然後接著有介紹一下公司在做甚麼 (主要是在做高頻交易,需要接交易所 API), 另外也有介紹到公司有一些 team 是在做 FPGA 跟網卡 Driver ... 等,用來降低交易延遲。 技術面談完之後,接著就是 HR 進來詢問我有沒有什麼問題之類的, 但不得不說我對整場面試的經驗蠻差的,原因是: 1.  零面的作業我覺得題目很沒意義 ...  2. 考了筆試卻完全沒問筆試內容,這樣筆試是在寫好玩的嗎 ... 3. 本來 HR 是找我面資深,結果說是年資不夠改成非資深的缺,我頗無言的是資深的年資說要 8 年 ...,意味者在裡面的工程師要待 8 年才能升等,中間都沒其他職等? 而且詢問 HR他們想要的資深人員的條件是啥,但也說得不清不楚 ... 4. 詢問 HR 很多關於公司制度面的事情,但 HR 好像是新來的,都不太了解 以上除了第四點我都有跟 HR 反應,HR 表示我狀況比較特別 (痾 其實3年經驗的人應該很多吧...),會再跟主官討論看看這樣。 結果: Offer Get,福利忘了但我記得不優 (應該是比照勞基法),83 K * 14 ~ 18 (HR 說法是每年獎金至少會有 2 個月,所以可當成 16 來看),另外薪資部分應該可以再談,但我確定沒要去這間就沒談了

[面試心得] Trend Micro / 趨勢 - Senior Software Engineer

零面. Codility 3 題 Codility,難度約 1 題 Easy 2 題 Medium, 久遠有點忘記題目了,但依稀記得 1 題有字串處理,另外 2 題算是 Greedy 吧, 時間給得很充裕,我寫完大約還有一半的時間。 一面. 現場 第一場 1hr. 部門 A (2 位考官) 先自我介紹, 接著詢問我做過的一些 Project,比如這 Project 為何使用 WebSocket / Protocol Buffer ? 等等之類的問題, 其中也會討論到如何 Debug,我遇過最難解的問題是啥? 最後如何解決之類的, 因為這部門主要是 C++ ,有接著詢問例如 std::vector 跟 std::list 的差別 ... 等基礎問題, 最後考官們會在介紹這個部門的風氣、工作內容是做甚麼,合作的部門有哪些這樣。 第二場 1hr. 部門 B ( 3 位考官) 跟第一場差不多。 最後 HR 近來表示二場考官對我的 Feedback 都很正面,應該會有二次面試這樣, 詢問我比較喜歡哪一個部門這樣,我表示要再想一下後回 EMAIL, 後來我回完 EMAIL 沒多久就收到二面邀請, 電話中表示這次考官的是 Manager,大約只要 30 min,可能會有技術問題這樣。 二面. 遠端 - 30 min 面試採遠端進行,原本以為會考一些技術問題,結果主管表示他對前面的考官有信心, 所以基本上這場面試只是主管想多跟我介紹一下部門在幹嘛這樣, 主管於面談中有告知會請 HR 跑後續流程這樣, 我覺得這主管算是我面試過最有誠意的 XD 三面. 電話 HR 面談 - 60 min HR 面試採電話進行,不得不說趨勢的 HR 真的很專業, 整個過程都是在針對你的履歷做一些詢問,例如做甚麼,怎麼團隊合作 ... 等, 而且提到一些專有名詞的時候,感覺 HR 也大概知道在幹嘛這樣。 另外 HR 也會介紹公司的制度、福利 ... 等等, 而且 HR 介紹也不是隨便幾句話這樣,講得很詳細,如: 工時、獎金如何分配 ... 等, 最後 HR 問我期望薪資,並表示會再跟上面討論這樣。 結果: Offer Get,福利我覺得算不錯 (工時 7.5 hr + 第一年特休 10 天 + 彈休 7 天 + 全薪病假),因為最後確定去這家,所以薪水有保密不好說,只能說薪資超出我原本對趨勢的想像 XD

[面試心得] Synology / 群暉 - Product Developr

一面. Skype  第一關 1hr. 後端考官 A  先自我介紹, 接著主考官會針對你履歷中的經歷做詢問  (印象中有: 怎麼找 race condition, cookie / session, 解釋 Polymorphism ... 等) 最後就是 Synology 必考的程式題, 題目是矩陣向右旋轉 90 度 (要求 in-place) 由於 leetcode 寫過這題, 很快就寫出 transpose 再 reflect 的解法 因為時間剩蠻多的考官 A 就問有沒有其他寫法, 於是就提出 Rotate Groups of Four Cells 這解法, 但寫的過程不是很順, 因為卡在推 index QQ, 但最後考官 A 叫我不要管 index 寫概念就好, 最後考官會讓你發問你想問的問題 (如: 公司 / 部門 ... 等) 第二關 1hr. 後端考官 B 一樣先自我介紹, 接著主考官會針對你履歷中的經歷做詢問  (印象中有: Load Balancer 可能會遇到什麼問題, 很大的資料庫下有什麼辦法加速查詢, struct 跟 class 的差異 ... 等) 最後也是 Synology 必考的程式題, 題目是實作 linked list 的 class 實作過程中考官 B 會慢慢要你增加一些功能, 並詢問你的寫法 (印象中有: nullptr 跟 NULL 差異, const int * 跟 int * const ... 等) 一樣最後考官會讓你發問你想問的問題 二面. 現場 第一關 1hr. HR 基本上就是在認識你的背景, 如: 前份工作為何離職, 怎麼會想來 Synology, 未來想走的方向 ... 等 第一關 2hr. 後端考官 C (應該是主管) 一樣先自我介紹, 接著主考官會針對你履歷中的經歷做詢問  (印象中這關技術面問得比較少, 詢問內容比較 focus 在你的背景, 未來興趣 ... 這些) 不過最後也是 Synology 必考的程式題, 題目是 Validate Palindrome 寫完後會接著延伸是問如何找出 Longest Palindrome 我寫出 Expand Around Center 的解法後主管又做了一些變形引導你寫 DP 解 原本以為要結束了, 考官最後又多出了一題類似 Encode / Decode 題,

[LeetCode][Medium] 31. Next Permutation

Leetcode 網址: https://leetcode.com/problems/next-permutation/ 題目說明: 題目的大致意思是給定一組數字,請將這組數字重新排列組合得到一個比原先數字大的排列, 假設給定的數字為 1 2 3,那麼 1 3 2 就是這個題目想要的答案, 假設給定的數字為 1 3 2,那麼 2 1 3 就是這個題目想要的答案。 Note: 題目要求空間複雜度為 O(1) 解題說明: 這題透過題目的敘述及觀察皆可以發現,我們要換的數字最好是越後面的位數越好, 假設我們找到可以透過替換第 8 位達成,那前面的第 1 ~ 7 位都不需要管它了, 因此我們要從後面去掃哪一個位數可以被替換, 假設今天要替換第 8 位數,我們只要有第 9 ~ n 位數中比第 8 位數大的數字即可, 至於要替換成哪個數字,想當然就是比第 8 位數大但卻是第9 ~ n 位數中最小的數字, 因此將以上的想法寫成程式即可,不過值得注意是替換完成之後不代表是正確答案, 例如: 1 3 2 透過以上算法得到會是 2 3 1,但實際上答案是 2 1 3, 因此我們再透過把後面的數字排序即可, 以上的時間複雜度為 O(n * n + n log n) = O(n * 2), 另外以上的算法很直覺但少用了一些題目的特性,考慮題目特性後可以優化成 O(n), 詳細優化的算法可以參考 這篇 程式碼 void nextPermutation(vector<int>& nums) { int index = nums.size() - 1; while (index > 0 && nums[index - 1] >= nums[index]) index--; if (index > 0) { int minIndex = index; for (int i = index; i < nums.size() && nums[i] > nums[index - 1]; i++) minIndex = i; swap(nums[index - 1], nums[minIndex]);

[LeetCode][Medium] 19. Remove Nth Node From End of List

Leetcode 網址: https://leetcode.com/problems/remove-nth-node-from-end-of-list/ 題目說明: 給定一個 linked list 與整數 n,請刪除"倒數"第 n 個 node。 Follow up: 能否在只跑一個 for loop 的情況下達成呢? 解題說明: 原本不太清楚 for loop 的定義所以直接用 stack 去解, 解完後去參考答案發現出題者想要的是用 two pointer 來解決問題, 其解法概念大致如下: 利用 first pointer 先跑 n 次 (first pointer = first pointer -> next), 那這樣跑過 n 次後的 first pointer 只要再跑 size - n 次即可到 null, 因此我們可以用 first pointer 跑到 null 的同時更新 second pointer, 那麼 second pointer 屆時會指到要被刪除的 node, 不過這樣會有一個問題是,我們這樣會無法找到要被刪除的 node 之前一個, 因此這題的核心是需要搭配一個 dummy head, 藉由這個 dummy head 可以讓 second pointer 指向要被刪除的 node 之前一個, 此外這樣也能順帶完美解決刪除 head 的罕見情況 XD。 程式碼 class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummyHead = new ListNode(0, head); ListNode* firstNode = dummyHead, * secondNode = dummyHead; for (int i = 0; i < n + 1; i++) firstNode = firstNode->next; while (firstNode != NULL) { firstNode = firstNode->next; secondNod

[LeetCode][Hard] 51. N-Queens

Leetcode 網址: https://leetcode.com/problems/n-queens/ 題目說明: 知名的 n 皇后問題,請找出 n 皇后的所有解。 解題說明: 使用 DFS 去窮舉出所有 n 皇后的解。 程式碼 class Solution { public: int flag[9] = {0}; vector<vector<string>> answers; bool isValid(vector<string>& board, int row, int col) { for (int i = 0; i < 9 && flag[i]; i++) { if (flag[i] == col) return false; if (flag[i] + i == row + col) return false; if (row - i == col - flag[i]) return false; } return true; } vector<vector<string>> solveNQueens(int n) { vector<string> board(n, string(n, '.')); dfs(board, 0, n); return answers; } void dfs(vector<string>& board, int row, int n) { if (row == n) { answers.push_back(board); return; } for (int i = 0; i < n; i++) { if (!isValid(board, row, i + 1)) continue;