> https://hackmd.io/@sysprog/ryl9ClupJ6 > 他評01- > 正面:英文咬字清楚 > 反面:REATCO的部分可以做得更好,然後少了中文兩部影片... > > https://hackmd.io/DD_kC-4CSB2gXQVpIjG9OA?both > 他評02- > 正面:REATCO的部分基本都要做到 > 反面:interviewee陳述自己的方法可以舉例說明為何可行 > interviewer可以通過問答去延伸問題 例如map是用什麼實做 > > https://hackmd.io/dd1z3Jw7S9CnGQO0jFKPGw?both > 他評01- > 正面:REATCO都有做到,而且打CODE的時候都詳細說明 > 反面:題目缺少了點包裝,除此之外沒什麼太大問題?! > https://hackmd.io/XianyRqySdSMQ_DWcW2QSA?both > 他評01- > 反面:缺少了test階段,interviewer都是看他打完code直接說great,沒考慮正確性問題 > 也沒有針對問題去做延伸 > 正面:interviewee的repeat和example有做到 > https://hackmd.io/uFnRXNBuTzGMO9L0gj0pwA?both > 他評01- > 反面:interviewee打完code後,都缺少了主動跑test case去說服正確性 打字速度太慢 > 需要練習邊打code邊解釋會更好 # 2023 年「資訊科技產業專案設計」hw 2: 貢獻者:姆咪-MUMI ## **OVERVIEW 對他人的評論(簡略):** ### 針對interviewer的評論: - 優點: 1. 題目說明非常明瞭。 2. 很好的面試開頭。 - 可改進之處: 1. 與interviewee的互動少 2. 題目稍微包裝一下會更好。 3. 問題單純只問時間以及空間複雜度略顯單薄,可以在interviewee回答的基礎上,去進行延伸的討論,例如討論資料結構 特性等... ### 針對interviewee的評論: - 優點: 1. 講解仔細 2. 說話流暢 - 可改進之處: 1. 缺REACTO步驟 2. 如果邊打code邊解釋會更好 3. 沒有詳細解釋時間複雜度或空間複雜度,只是純粹說 多少多少 ## 經過HW1以及HW2他評後學習到了什麼? 評論別人找尋其他人的缺點以及優點時,看到一些同學真的很秀,沒想到還有這種操作:同時也是在檢視自己哪裡做會更好,看看同學有沒有注意到我哪些部份可以做得更好,順便多看看leetcode的題目(因為之前沒有刷題的經驗)。其中: ### 許多人沒做到(有人有做到)而我也沒做到的地方 - 題目的包裝 - 少了repeat和examples 沒仔細確認題意 - 英文發音像是在棒讀,硬要抑揚頓挫,結果就是很怪== - 要主動跑test case 說服程式的可執行性 ### 自己覺得自己做的還不錯的地方 - 有畫圖來輔助想法 - 程式講解仔細 - 有說明為什麼改善的原因 --- ## [LEETCODE影片](https://youtu.be/wZHPKnOQ6Nw):[21.Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/) > 🧔:interviewer 👶:interviewee ## **面試過程** **Repeat&Example** 🧔:感謝你的時間,接下來由我主持這場面試,若過程中有任何疑問都歡迎提出來。首先我們公司有一部分是在做雲端業務服務,有時候客戶會需要將好幾個資料夾的檔案給整理成一個,那客戶會希望他資料夾裡面的檔案依然是保持他的順序。 那假設今天有兩個資料結檔案是按照他的字母順序去排序的,那合併之後一樣是保持著按照字母順序排序 👶:所以,我們今天的目標是把兩個資料夾檔案合併再一起,一樣是保持他的順序嗎? 🧔:是的,沒錯 👶:那我可以來舉例一下,來確認一下對於題目的理解嗎? 🧔:好的 👶:如果今天有兩個資料夾裡面分別有ABC和DEF這三個檔案,那這兩個資料夾合併之後會是ABCDEF這樣順序嗎? 🧔:是的 👶:那如果今天有兩個資料夾裡面分別有ACD和BEF這三個檔案,那這兩個資料夾合併之後依然會是ABCDEF這樣順序嗎? 🧔:是的 **Approach** 👶:那麼我可以提出我的解決方案,我會把這個問題轉化成有兩個array,分別裝著ACD、BEF,接著將這兩個array合併成一個變成ABCDEF。 👶:我直覺上我會使用遞迴的方法,名叫**merge的遞迴**。首先要考慮a,b這兩個array,其中一個為空的狀況,a為空則輸出b,反之亦然;接著要去做比較這兩個array第一個檔案的檔名,由於兩個資料夾已經按照順序排序好了,所以可以直接做比較,然後去比較字母的ascii大小,先輸出較小的那個,而剩下的繼續帶入遞迴去做比較。 補充說明:[ascii碼](https://zh.wikipedia.org/zh-tw/ASCII) 🧔:聽起來還不錯,你可以開始實作你的想法 👶:我打算用c++來實作,請問可以使用STL嗎? 🧔:沒問題 ``` struct ListNode { int val; ListNode *next; }; class Solution { public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { // If one of the list is emptry, return the other one. if(!l1) return l2; else if(!l2) return l1; // The smaller one becomes the head. if(list1->val < list2->val) { list1->next = mergeTwoLists(list1->next, list2); return list1; } else { list2->next = mergeTwoLists(list1, list2->next); return list2; } } }; ``` **TEST & Optimization:** 👶:就像我剛剛說的,有兩個array分別裝著ACD、BEF,因為A<B麻,所以會執行 **if(list1->val < list2->val)**,會先return A,然後剩下的放入遞迴繼續執行;接下來B比較小,會去執行else return B 和前面做差不多的行為,依此類推。 🧔:可以請你分析一下這段程式碼的時間/空間複雜度嗎? 👶:時間複雜度:O(A資料夾的檔案大小+b資料夾的檔案大小) 空間複雜度也是,因為要去call recursive fuction 🧔:可是有時候有些客戶一個資料夾會裝太多檔案,會需要這麼多的記憶體空間,可能會發生stack overflow。那有沒有辦法調整去預防這種問題呢? 👶:這可以通過跌代的方法來處理,因為不用call recursive function 🧔:請嘗試看看實作你的想法 ``` struct ListNode { int val; ListNode *next; }; class Solution { public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { ListNode dummy(0); ListNode* tail=&dummy; while(list1 && list2) { if(list1->val < list2->val) { tail->next=list1; list1=list1->next; }else{ tail->next=list2; list2=list2->next; } tail=tail->next; } if(list1) tail->next = list1; if(list2) tail->next = list2; return dummy.next; } }; ``` 👶:雖然這麼更改,不會執行的比較快,但是他的空間複雜度卻能降低到O(1) 🧔:好的,感謝你這次的面試,如果有後續的消息會再通知你的 ## 第四次作業-他評01 ### 關於 interviewer - [ ] 優點 - [9:27](https://youtu.be/wZHPKnOQ6Nw?t=567)針對複雜度的問題延伸問題。 - [ ] 可改進的地方 - [3:41](https://youtu.be/wZHPKnOQ6Nw?t=221)應該是回答"可不可以"而不是"好的"。 ### 關於 interviewee - [ ] 優點 - [5:36](https://youtu.be/wZHPKnOQ6Nw?t=336)解釋比較的邏輯清楚,但可以在旁邊打上註解方便之後test說明。 - [ ] 可改進的地方 - [2:39](https://youtu.be/wZHPKnOQ6Nw?t=159)approach時還是用打字的比較好閱讀,拿滑鼠寫字有點難閱讀,且速度也慢。 - [8:08](https://youtu.be/wZHPKnOQ6Nw?t=488)畫面拉太小。