# 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的時候一直滾動頁面很痛苦。