# 2023 年「資訊科技產業專案設計」作業 2 # 作業2 - 檢討 ## 沙西米 Sashimi > https://hackmd.io/@sysprog/S1hhirak6 **interviewer** 優點 - 與面試者有很多互動,對於程式碼的改進有給予方向,而非直接說出有更佳的解法。 - 咬字清晰 可改進處 - 建議結尾加上感謝面試者參加之類的話,讓面試有結束的感 - (英) Merge Two List 應該是常見的題目,建議可以增加一些題目變形,例如改成 Merge K List;或是討論是否有優化的可能性。 **interviewee** 優點 - 一邊寫一邊講解。 - 清楚確認題意與邊界條件,確認雙方理解沒有落差。 可改進處 - [2:27](https://youtu.be/3IrwM1HSLoI?si=Nu18Q2xsbKHBrYUZ&t=147)、[(英)2:24](https://youtu.be/ohBt69LbsrY?si=QFbWTlGGv-8IyI1l&t=144) 停頓有一點久,建議可以解釋目前在寫的程式。 ## 胡迪 Woody > https://hackmd.io/@sysprog/BkZaJUTkT **Interviewer** 優點 - 使用手勢輔助說明 - 語調輕快,面試氣氛良好 - 75. Sort Colors 最後有對題目進行延伸討論 可改進處 **Inerviewee** 優點 - 使用手勢輔助說明 - 一邊寫一邊解釋程式碼 可改進處 - [1:20](https://youtu.be/cJuaoweDGh0?si=4FzC3YKloUTu22Fa&t=80)、[4:33](https://youtu.be/cJuaoweDGh0?si=zsiFGDBv3aT1wMyO&t=273) 建議將舉的例子打在螢幕上,方便雙方理解。 - 建議變數 `pass` 可以考慮命名為 `remaintime`,因為在後面頻繁提到 Pass 單字,會有混淆的疑慮。 - 根據 REACTO 步驟,建議最後可以簡短的對程式碼進行測試。 ## 蕭卡辰 James > https://hackmd.io/@sysprog/H1lC18T1p#1920-Build-Array-from-Permutation **Interviewer** 優點 - 有先確認雙方是否都有聽到聲音 - 沒有出現上對下的名詞,整個面試氣氛良好。 可改進處 - 建議可以針對程式碼做進一步的討論,例如: - [2:44](https://youtu.be/tzNY52QwA2I?si=FGdlJjS_HH1H--EC&t=164) 為什麼不直接宣告 2n 的大小,而是要使用 resize。 - [6:31](https://youtu.be/tzNY52QwA2I?si=YNiChciMR78I9OPx&t=391) 面試者修改後實際上存取的次數依舊是 2n 次,但這樣寫帶來的好處是什麼?(參考:[Loop Unrolling](https://en.wikipedia.org/wiki/Loop_unrolling)) - (英) 建議把題目敘述一遍給面試者聽,增加雙方互動。 - (英) [7:36](https://youtu.be/ND10VCttwr0?si=vOm-uKv9p8LgiNDG&t=456) 建議使用討論的方式取代直接告訴面試者存在更佳解。例如:有沒有辦法使用更少的空間。 **Interviewee** 優點 - 有一邊寫一遍進行講解。 可改進處 - [1:06](https://youtu.be/tzNY52QwA2I?si=4k2MrCFHhWWcegGf&t=66) REACTO 中 Repeat 步驟感覺像是在告訴面試官題目,建議更改複誦方式,讓其聽起來更像是在跟面試官確認題意。 - [4:04](https://youtu.be/tzNY52QwA2I?si=olWKS5oG4k5mrJAs&t=244) 影片提到「index 的因素考慮進去」,建議可以直接講考慮的因素,例如:存取到非法記憶體。 - [8:18](https://youtu.be/ND10VCttwr0?si=I__AFmOYX5H4CSh6&t=498) 建議可以更清楚的交代思考的邏輯,而非直接寫出答案。 其他建議 - [11:54](https://youtu.be/tzNY52QwA2I?si=vSbaw4sRdmIy_Q-T&t=714) 不確定翻書是否是可以的,建議可以先與面試官討論。 ## 梅治玄 Marlin > https://hackmd.io/JLn3MNc0R66HgPJxJ8vsRQ?view **interviewer** 優點 - 咬字清楚 - 有與面試者確認是否有看到畫面 可改進處 - 建議不要直接使用 Leetcode 作為面試的畫面,容易讓面試者可以直接背誦題目。 - 建議可以與面試者增加互動: - 討論是否存在更加解法。例如:[18:50](https://youtu.be/_MDo9wR-2hI?si=znoz-67JmarzFo2Y&t=1130) `long long` 是否有只使用 `int` 的可能 - 將題目做變形 **interviewee** 優點 - 明確的敘述思考邏輯,且在寫的過程中同時也有解釋程式。 - 清楚的與面試官溝通題意,確定雙方理解沒有落差。 可改進處 - 建議舉例的時候可以將範例寫在螢幕上,方便雙方進行溝通。 其他建議 - 建議把面試者與面試官兩者的音量調整至相同大小 ## 東尼 Tonny > https://hackmd.io/@sysprog/rkF5edaJa **interviewer** 優點 - 有將題目做包裝 - 有針對程式碼與複雜度分析做討論 可改進處 - [0:28](https://youtu.be/wjSqYJdnXFM?si=ct7kpoDUfSJ9hqPX&t=28) 建議將「你要面對的第一道題目」改成有一些問題想跟面試者討論,降低面試緊張氣氛。 **interviewee** 優點 - 清楚的與面試官確認題意,確定雙方的理解沒有誤差。 可改進處 - [2:45](https://youtu.be/wjSqYJdnXFM?si=P1mrtoAvz9Kr5VxE&t=165)、[16:57](https://youtu.be/wjSqYJdnXFM?si=T-fo-ZoeUIKueJLZ&t=1017)、[22:49](https://youtu.be/wjSqYJdnXFM?si=5oMo0aywQ3zG7o_E&t=1369)、[3:24](https://youtu.be/LwsIlnniceo?si=fgk87lPeqnuJV09K&t=204) etc. 感覺可以不用把文字打出來,或是簡短的作標記即可。 - [17:55](https://youtu.be/wjSqYJdnXFM?si=K1P1AstcHeKrW3LK&t=1075) 因為比較的方式已經顯而易見,可能直接用口述的方式會比較好。 - [26:18](https://youtu.be/wjSqYJdnXFM?si=cHidrfsoseAnGsZL&t=1578) 感覺有點答非所問,也許直接回答因為使用的是比較排序法,而比較排序法的下界是$O(n\log n)$。如果有需要在進一步帶到證明感覺會比較好。 ## 學到的東西 * 一些題目不同的思路 * 看到更多不同面試官與面試者之間的應答技巧 # 作業2 - 錄影 > 貢獻者: 林克-Link >[video](https://youtu.be/0Wg8aAR5yxc) > 🧔:interviewer 👶:interviewee ## [1. Two Sum](https://leetcode.com/problems/two-sum/) ### 測驗說明與問答 🧔: 嗨你好,歡迎來到今天的面試,我是今天的 Interviewer,等下會有一些問題想跟你討論,主要是想要了解你的想法,但還是希望你可以將想法用程式碼的方式表達。 🧔: 那我現在傳一份 Google 文件給你,裡面有等下要討論的問題。我們目前有一個使用情境是 clients 要向 servers 請求資料,每個 server 都有同時可傳送的資料上限,為了我們目前的環境考量,每個 client 只能向兩個 server 請求資料,最好的情況是兩個 server 的上限剛好等於 client 需要的資料大小,如果沒有辦法滿足的話,就挑一個上限最大的 server 進行請求。 👶: 我確認一下題意,也就是 client 的請求會被切成兩份,這兩份要剛好符合其中兩個 server 的上限,如果沒辦法滿足的話就找一個上限最大的 server。 🧔: 對 👶: 也就是說,如果 client 的請求改成 400,(略) 🧔: 對的 👶: 我想在確認一下 server 數量與 client 請求大小有特別的限制嗎? 🧔: 沒有,因為 client 的請求與 server 數量皆大於 0,你可以考慮使用 unsigned int。 👶: 我想在問一下,client 是可以直切取得最新的資料嗎? 🧔: 對,你可以假設 client 永遠拿到最新的資料,不會有任何同步的問題。 👶: 使用 key value 的方式。 🧔: 聽起來不錯,你可以用程式碼表達嗎? 👶: 對的 ```cpp vector<int> GetServer(vector<int> server, unsigned int psize){ if (level == 0) return vector<int>(0,0); map<int, int> Table; for (int i = 0; i < server.size(); i++){ if (Table[server[i]]){ return vector<int>{Table[i]], i + 1}; int remain = psize - server[i]; Table[remain] = i + 1; vector<int> rtl = GetServer(vector<int>(server.begin()+1+i, server.end()), remain); if (rtl.size() == 2) return vector<int> {i + 1, rtl[0], rtl[1]}; } return vector<int>{pmax}; } ``` 🧔: 這看起來是不錯的解法,如果我想要存取的 server 數量改成 3、4 甚至是 5 個呢? 👶: 我第一個想到的方式是遞迴。 ```cpp vector<int> GetServer(vector<int> server, unsigned int psize, int level){ if (level == 0) return vector<int>(0,0); map<int, int> Table; unsigned int max = 0; pmax = 0; for (int i = 0; i < server.size(); i++){ if (max < server[i]){ max = server[i]; pmax = i + 1; } if (Table[server[i]]){ return vector<int>{Table[i]], i + 1}; int remain = psize - server[i]; Table[remain] = i + 1; vector<int> rtl = GetServer(vector<int>(server.begin()+1+i, server.end()), remain ,2); if (rtl.size() == 2) return vector<int> {i + 1, rtl[0], rtl[1]}; } return vector<int>{pmax}; } ``` ### 他評01 #### interviewer優點 - [1:23](https://youtu.be/0Wg8aAR5yxc?t=83) : interviewer 有適當舉例並留有其他例子供 interviewee 發想。 #### interviewer待改進 - [0:22](https://youtu.be/0Wg8aAR5yxc?t=23) : 視訊畫面應當置於適當的位置,以 Google 文件舉例,可以放置於進行文字編輯時不會遮擋也不影響面試進行的右上角。 - [17:08](https://youtu.be/0Wg8aAR5yxc?t=1028) : 當 interviewee 解釋完實作方式後,可以與 interviewee 就當前問題與解法做討論,比方說該方法的時間複雜度與空間複雜度為何,有沒有更快的方法或可以修改的地方,等這些都討論完後再對問題做延伸。 #### interviewee優點 - [3:12](https://youtu.be/0Wg8aAR5yxc?t=190) : interviewee 有將問題的限制先與 interviewee 確認 ### 他評02 #### 優點 * [2:25](https://youtu.be/KYugQe23BTc?si=dR-DmO618zMDdD9f&t=145): 在Repeat problem的部分很仔細。 #### 可改進的地方 * [11:00](https://youtu.be/KYugQe23BTc?si=dR-DmO618zMDdD9f&t=660): Test的時候一直滾動頁面很痛苦。