# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023/)」課程第 1 次作業 > 貢獻者: 抹茶-Matcha > 模擬面試錄影: [1](https://www.youtube.com/watch?v=mgyhMfmlL-o)、[2](https://www.youtube.com/watch?v=tg1ID5F-dUg)、[3](https://www.youtube.com/watch?v=7XhYtRiK8dc) > > :smiling_imp: interviewer > :smile:: interviewee ## [509. Fibonacci Number](https://leetcode.com/problems/fibonacci-number/) :smiling_imp: 您好, 我是你今天的面試官, 接下來會問你程式問題。請你說出你的想法,並用程式去實作出來。 :smiling_imp: 這題是費波納氣數列,每一個數字都是前兩個數字的加總。當 n 大於 1 時, 就是第 n 個數 是由 第 n-1, n-2 個數相加。 ...... :smiling_imp: :smile:: 我想理解我是否理解這道問題。這題是要我們 ... :smiling_imp:: 你的理解正確。 :smile: 那我講一下我這題的方法。因為會用到前兩個的結果。我想用 recursive 方式去解。recurson tree 會是這。舉例以 4 來說,...... :smiling_imp:: 好的,看起來沒問題,你可以開始實作了 :smile:: ...... :smiling_imp:: 看起來實作和分析都沒問題。你可不可以在做一些優化。讓時間和空間複雜度在減少一些。也可以用其他方法 :smile:: 我想用 iterative 方式去解。 ...... :smiling_imp:: 看起來沒問題,你可以開始實作了。 :smile:: ...... recursive ```cpp int fib(int n){ if(n <= 1) return n; else return fib(n-1) + fib(n-2); } ``` > time complexity: O(2^n) > space complexity: O(n) iterative ```cpp int fib(int n){ if(n <= 1) return n; int a = 0, b = 1; for(int i = 2; i<=n; i++){ int c = a + b; a = b; b = c; } return b; } ``` > time complexity: O(n) > space complexity: O(1) ## [104. Maximum Depth of Binary Tree](https://leetcode.com/problems/maximum-depth-of-binary-tree/) :smiling_imp:: 您好, 我是你今天的面試官, 接下來會問你程式問題。請你說出你的想法,並用程式去實作出來。 :smiling_imp:: 這題是 maximum depth of binary tree。 ...... :smile:: 我想確認我是否理解題目。 :smile:: ...... :smiling_imp:: 你的理解正確 :smile:: 好我想再確認 root 是 nullptr 的時候(edge case) :smiling_imp:: 是的, 如沒有其他問題,你可以說出自己的想法。 :smile:: 這題我想使用 dfs :smile:: ...... :smiling_imp:: 想法沒有問題。可以開始實作了。 :smile:: ....... :smiling_imp:: 但是這題還有其他做法。請你用其他做法實作。 :smile:: 可以用 bfs 解。 (略) :smiling_imp:: 你的想法沒有太大問題,可以實作程式了。 :smile:: ...... dfs ```cpp int maxDepth(TreeNode* root) { if(!root) return 0; int maxL = maxDepth(root->left); int maxR = maxDepth(root->right); return 1 + max(maxL, maxR); } ``` > time complexity: O(n) > space complexity: O(d), d: depth bfs ```cpp int maxDepth(TreeNode* root) { if(!root) return 0; queue<TreeNode*> q({root}); int level = 0; while(!q.empty()){ level++; for(int i = q.size()-1; i>=0; i--){ TreeNode* cur = q.front(); q.pop(); if(cur->left) q.push(cur->left); if(cur->right) q.push(cur->right); } } return level; } ``` > time complexity: O(n) > space complexity: O(n) ## [215. Kth Largest Element in an Array](https://leetcode.com/problems/kth-largest-element-in-an-array/) ```cpp int findKthLargest(vector<int>& nums, int k) { sort(nums.begin(), nums.end()); return nums[nums.size() - k]; } ``` > time complexity: $O(n \log{n})$ > space complexity: O(1) ```cpp int findKthLargest(vector<int>& nums, int k) { priority_queue<int, vector<int>, greater<int>> pq; for(auto& i:nums){ pq.push(i); if(pq.size() > k) pq.pop(); } return pq.top(); } ``` > time complexity: $O(n \log{k})$ > space complexity: O(k) ## 初步檢討 - 英文面試不夠流利 - 實做完程式沒有用 test case 去驗證 --- ## 第二次作業-他評01: ### interviewer - [ ] 優點: * 口齒凡清晰的,interviewee也是 - [ ] 可改進: * 可以開頭自我介紹名字,後面interviewee可以用名字稱呼interviewer * MaxDepth那題我覺得interviewer題目給得太清楚太明確,這樣會比較難看出interviewee的反應,其他題目也都有該情形 * interviewer應該多給interviewee一些展現的機會,例如以引導式的方式來讓interviewee回答 ### interviewee - [ ] 優點: * REACTO都有做到,讚👍 * 程式碼解釋清楚 * 有解釋自己所使用的演算法 * 撰寫程式時臨場感佳,有些部分寫到一半回去修改剛剛寫完的部分,比較不像是scripted的 - [ ] 可改進: * 挑的題目都蠻制式化的,可以挑一些實際應用佳的,或是把題目轉化成實際場景 * 英文那題Kth Largest Element in an Array,題目本身就是一個sort問題了,不應該使用到C++ stl的sort來解,主要是interviewer應該提前告訴interviewee不要用到std:sort()或是看到interviewee使用sort作法做完後,interviewer要告知interviewee使用別的做法 ## 第二次作業-他評02 ### 關於interviewer - [ ] 優點 * 聲音穩定。 * 有說明題目。 - [ ] 可改進的地方 * 對 interviewee 的回饋偏少。 * 適時變更題目限制。 * 針對 Test 的部分可以進一步詢問。 ### 關於interviewee - [ ] 優點 * 聲音穩定。 * 詢問並根據題目敘述舉出例子。 * 有說明時間複雜度。 * 邊打字邊講解。 * 有將思考方向先當作註解寫在程式上。 - [ ] 可改進的地方 * 字型可以放大,例如將瀏覽器設定為全螢幕。 * 509. Fibonacci Number * iteration 的程式可以用例子跑一遍。 * 104. Maximum Depth of Binary Tree * [2:20](https://youtu.be/tg1ID5F-dUg?t=140): 避免頻繁搖動滑鼠。 * 215. Kth Largest Element in an Array * Constrains 沒有提及 nums 陣列中的元素大小的範圍。 - [ ] 其他 * 我覺得不應該把整個人碼掉 * 英文那題hackmd沒有文本 ## 第二次作業-他評03 ### interviewer - [ ] 優點 * 說話清晰 - [ ] 可改進的地方 * 不該自稱是「面試官」,這樣會有「上對下」的隱含意思 * 建議將題目包裝成其他應用的場景,避免出現背答案導致鑑別度不足,也可以考驗 interviewee 的理解能力和應變能力 * 可留一點問題讓 interviewee 問,例如說先不講變數限制,看看 interviewee 是否有思考邊界條件 ### interviewee - [ ] 優點 * [2:54](https://youtu.be/mgyhMfmlL-o?si=OuyEpP3gyt2q1jgt&t=174): 有清楚表達解決問題的思路,例如:為什麼會想用遞迴的方法來解 * 主動分析時間和空間複雜度 - [ ] 可改進的地方 * 作答前應該先溝通使用的程式語言 ## 第二次作業-他評04 ### interviewer - [ ] 優點 * 口齒清晰,音量適當 - [ ] 可改進的地方 * interviewer 不應該自稱 interviewer * 不應該使用 LeetCode 原題,可適度變形,鑑別並篩選掉只會刷題目的 interviewee ### interviewee - [ ] 優點 * 口齒清晰,音量適當 * Repeat 及 Example 部分解釋得非常清楚 * 邊寫程式邊做解釋,讓 interviewer 更容易了解你的想法 - [ ] 可改進的地方 * [0:44](https://www.youtube.com/watch?v=7XhYtRiK8dc&t=44): 打錯字 test cast -> test case ## 第二次作業-他評05 ### interviewer - [ ] 優點 * 會引導面試者接下來應該說什麼 - [ ] 可改進的地方 * 題目給得太詳細了,可以把舉例和確認條件的工作給面試者做。 ### interviewee - [ ] 優點 * 舉例與分析很詳細,尤其是把遞迴的內容都寫出來 - [ ] 可改進的地方 * 將 fibonacci 改為 iterative 之後,應該舉例驗證正確性 * 不該自稱面試官 ## 第二次作業-他評06 ### interviewer - [ ] 優點 * 有給interviewee明確的指示,一步一動作。 - [ ] 可改進的地方 * 把題目給的過於明確,可能會導致後續與interviewee沒有更多的討論空間,coding interview淪為線上觀看別人寫LeetCode。 * 或許可以用一些實務場景來對題目進行包裝,也能夠以此延伸討論方向。 ### interviewee - [ ] 優點 * 在畫面的呈現上有經過思考與設計,範例與遞迴的結構都能夠明確的呈現。 - [ ] 可改進的地方 * [08:01](https://youtu.be/tg1ID5F-dUg?si=buE_qKSK6DKlWQbh&t=480):有口誤,應該是空間複雜度。