Try   HackMD

2023 年 資訊科技產業專案設計 homework2

一,互評部分

第一位同學(瑞比-Rabbit)

關於interviewer

可改進的地方

0:05: 說"直接開始面試題目" 會讓人覺得今天是來考試的,建議可以改成"公司請我來了解你/妳的情況並協助你/妳更認識公司"
0:08: 如果是經典的題目,可能會需要包裝成另一情境,否則會出現背答案導致鑑別度不足,也可以考驗interviewee的理解能力和應變能力
1:33: 當interviee 講完自己的做法時,interviewer 應給予適當的討論或提出一些可能會出錯的情況,而不是讓interviwee自顧自地開始寫code
3:29: interviewer說:"這個程式不完整",但沒有提出哪裡不完整,要是interviewee不知道自己哪裡漏寫,自然無法做出修改,建議interviewer可以用例子去讓interviewee帶入,使他自己發現哪裡有缺漏。
12:13: 在interviewee完成程式後,建議可以進行討論及優化,或是用實際example test過,若是寫完程式就結束會更像是程式設計的上機考。
4:38: interviwer 應該可以在interviewee 解釋方法時就可以發現用了variable extra space,可以即時與interviewee討論
8:10 建議可以與intervievee討論過時間複雜度再請他改進,否則也不確定對方是否會分析 時間複雜度

關於interviewee

優點

1.邊寫code邊講解的很清楚
2.闡述解法的時候很清楚
3.有合適的肢體語言顯得不死板

可改進的地方

1:30:建議可以停頓觀察interviewer的反應,也許對方會提出質疑或是不同的看法

1:10: interviewee 應當向interviewer確認題目的條件,否則可能不會知道所謂constraint

第二位同學(沙西米-Sashimi)

關於interviewer

優點

1.很清楚的闡述interviwee的作法有什麼缺點(例如使用太大的記憶體或linked list 長度可能不一致),而不是單純評論"好"或"不好",也可以讓interviwee知道哪裡可以改
2.語速適中,英文發音也很清楚
3.有提出更進一步的問題要求interviewee現場解決(第二題)

可改進的地方

1:31,1:07: 建議interviewer可以要求interviwee 先提出預計的作法或是構想,若是直接讓interviwee寫code ,interviwee不見得有想法或是不一定是正確的作法
10:29,10:46: interviewee完成後,interviewer可以給一些評論或是討論,讓interviewee做ˇ哦是否正確或是有可以需要改進的地方。
0:26: 如果直白地把題目闡述出來,加上有關鍵字"linked list","加法",建議可以包裝成另一情境,避免出現背答案導致鑑別度不足,也可以考驗interviewee的理解能力和應變能力

關於interviewee

優點

1.對於針對題目的repeat 和 example很清楚詳細
2.完成程式後有做test來驗證程式碼是對的

可改進的地方

3:12: 這一段停頓得比較久,可能可以說點什麼來避免對方失去興趣和專注

第三位同學(克勞迪(Cloudy))

關於interviewer

優點

1.對題目的闡述都很清楚,儘管沒有舉例也能讓人立刻理解
2.15:51有針對作法提出改善的可能方案,而不是簡單的說"請降低時間複雜度"

可改進的地方

3:53:"聽起來沒什麼問題"可能會有給人一種好像沒什麼在聽的感覺,建議可以對interviewee的想法提一些問題或是討論
12:42,0:33:建議可以把題目包裝成另一情境,避免出現背答案導致鑑別度不足,也可以考驗interviewee的理解能力和應變能力

關於interviewee

優點

1.對於針對題目的repeat 和 example很清楚詳細
2.主動分析與討論時間複雜度和空間複雜度

可改進的地方

3:51: 所闡述的做法較為複雜且抽象,建議可以搭配一個實際例子來做講解
6:00,11:15(每一段打code):在打code的時候建議搭配講解,否則interviewer要會一直盯著code 容易不耐煩且無法進入狀況,也可以嘗試以寫一兩句講解一次開始

*比較缺乏REACTO 的test 部分(漢語)

第四位同學(卑鄙葛摟-Babygirl)

interviewer

優點

1.有提點interviewee應注意的細節
2.有提問兩種做法的相異處,可以測試到interviewee對程式的了解,而不是死背。

可改進之處

7:42,5:21: 感覺可以先對interviewee目前寫好的code做評論或提問,再請他優化,可能會比請他直接提供另外一種做法要更好
0:08:建議可以把題目包裝成另一情境,避免聽到關鍵字就開始背答案導致鑑別度不足,也可以考驗interviewee的理解能力和應變能力

interviewee

優點

1.邊打code邊講解的很順暢
2.2:33:將所舉的例子key出來很清楚詳細,讓人一看就明白

可改進之處

可以增加一些肢體動作或停頓(加強)來讓自己的整段對話重點更加突出。
較為缺乏REACTO的 Test部分(英)

第五位同學(佛萊迪 Freddy)

interviewer

優點

1.有直接根據code 給出公司的要求,要求interviewee做進一步優化討論
2.問題闡述詳細

可改進之處

14:06: 如果只問"你有其他辦法嗎",若是在撰寫過程中沒有發現或想到其他辦法的話,此時還是一頭霧水,所以interviewer可能可以指出特定的點,要interviewee做出優化
0:08:開頭有點太像主持一個show,會給人一種不太認真(嚴肅)的感覺

在英語口說的時候,一句話中"強調"的字通常是關鍵字,但同學"強調"的字眼卻可能是連接詞或語助詞,會比較無助於抓重點。

interviewee

優點

1.分析時間複雜度時的分析很清楚詳細,不會只吐出一個答案
2.有主動做Test

可改進之處

3:45:建議可以停頓觀察interviewer的反應,也許對方會提出質疑或是不同的看法
在邊打code 邊解釋的時候可以更有自信一些,避免一些思考時的贅字,會顯得對自己的東西不太確定,以及與其卡在一個詞,不如放慢語速想好再講完。

在打code 的時候,有時候會變成喃喃自語

二,模擬面試部分

video

🧔 : 你好,歡迎你來到我們公司,公司請我今天來與你進行面試,接下來我會提出一些問題,希望你可以依照你的經驗來提出解決方案和我一起討論。

今天,公司拿到兩串產品型號的清單,個別已經由小排到大了,想請你提出一個將按照大小將兩個清單整理在一起的方法。
這兩個清單會以linked list的資料型態存在。
👶 : 請讓我整理一下問題,我會拿到兩個已經排序過的list,接著我要由小到大合併這兩個list嗎

🧔 : 沒錯。你的理解是對的。
👶 :舉例來說:
list1: [4 ,8 ,9]
list2: [1 ,4 ,7]
> [1,4,4,7,8,9]
另外我需要考慮會有空的list 的情況嗎
🧔 :你舉的例子正確無誤,並且需要考慮會有空list 的情況。
接下來請你提出你會用什麼策略進行
👶 : 直觀的方式我會想用迭代的方法。會使用 while 迴圈走遍兩個LIST並比較兩個目前節點的值,然後決定將哪個節點新增到合併後的list中。
🧔 : 這會是最直觀的方式,請你用程式實作。
👶 :

class Solution { public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { ListNode* n = new ListNode(0); ListNode* merge = n ; while (list1 != NULL && list2 != NULL) { if (list1->val < list2->val) { merge ->next = list1; list1 = list1->next; } else { merge ->next = list2; list2 = list2->next; } merge = merge ->next; } if (list1 != NULL) { merge ->next = list1; } else { merge ->next = list2; } return n->next; } };

🧔 : 是的這樣做可以解決這個問題的好方法
但想請你提出不使用迭代另外一種方式,並討論兩個方法的差異
👶 :那我會改用遞迴的方式,我們比較兩個list的第一個節點的值,假設list1的值比較小,將該節點添加到合併的list中,然後以遞歸方式呼叫相同的函數,傳入該list1的下一個節點和list2的當前節點。直到其中一個list跑到最後。
🧔 :請你用實作出來並討論兩個方法的差異
👶 :

ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { if(list1 == NULL) return list2; if(list2 == NULL) return list1; if( list1->val <= list2->val) {list1->next = mergeTwoLists(list1->next, list2); return list1;} else {list2->next = mergeTwoLists(list1, list2->next); return list2;} }

在過往經驗來看,通常遞迴的方法通常是把問題拆解成子問題去解決,會比起迭代這種把每種可能性都列舉出來的方式要有效率。但在今天這個情況中,因為只有兩個list,而且都會從第一個節點走到最後一個節點,或是其中一個list 用盡。所以在程式效率上是幾乎相同的。但在空間複雜度上,遞歸方法的空間複雜度為 O(n+m),而迭代方法的空間複雜度為 O(1),因為使用了常數空間來儲存合併的list。

第四次作業他評-01

  • 有對題目進行包裝
  • 口齒清晰
  • 寫完程式碼後可以提及 時間複雜度和空間複雜度
  • 6:26詢問作法上的差異可以避免死背程式碼的部分,也可以知道 Interviewee 為什麼選擇此演算法,問得很好
  • 最後 Interviewer 應該要對 Interviewee 做出回應,後面結束的有點突然