--- title: 2023 年資訊科技產業專案設計課程 tags: INFO2023 --- # 2023 年 資訊科技產業專案設計 homework2 # 一,互評部分 ## 第一位同學([瑞比-Rabbit](https://hackmd.io/X-Hy4HGGSheh3QGzphYlQA?view)) ### 關於interviewer ### 可改進的地方 [0:05](https://youtu.be/8QrihLMbbxE?si=YTcN3GooTBXPDpOG&t=5): 說"直接開始面試題目" 會讓人覺得今天是來考試的,建議可以改成"公司請我來了解你/妳的情況並協助你/妳更認識公司" [0:08](https://youtu.be/8QrihLMbbxE?si=8yZf0DonMYiL0ksC&t=8): 如果是經典的題目,可能會需要包裝成另一情境,否則會出現背答案導致鑑別度不足,也可以考驗interviewee的理解能力和應變能力 [1:33](https://youtu.be/8QrihLMbbxE?si=yGgjG9_fQkvr82Je&t=93): 當interviee 講完自己的做法時,interviewer 應給予適當的討論或提出一些可能會出錯的情況,而不是讓interviwee自顧自地開始寫code [3:29](https://youtu.be/8QrihLMbbxE?si=MXYUMmL8bD2WjpCd&t=209): interviewer說:"這個程式不完整",但沒有提出哪裡不完整,要是interviewee不知道自己哪裡漏寫,自然無法做出修改,建議interviewer可以用例子去讓interviewee帶入,使他自己發現哪裡有缺漏。 [12:13](https://youtu.be/LMiuK6xIDN4?si=H67PAJLMC6kIbvEu&t=733): 在interviewee完成程式後,建議可以進行討論及優化,或是用實際example test過,若是寫完程式就結束會更像是程式設計的上機考。 [4:38](https://youtu.be/xAjuPWqfqGU?si=D04gRENL8S_WRPbK&t=278): interviwer 應該可以在interviewee 解釋方法時就可以發現用了variable extra space,可以即時與interviewee討論 [8:10](https://youtu.be/xAjuPWqfqGU?si=vxElwQYYr3N7kXkU&t=490) 建議可以與intervievee討論過時間複雜度再請他改進,否則也不確定對方是否會分析 時間複雜度 ### 關於interviewee ### 優點 1.邊寫code邊講解的很清楚 2.闡述解法的時候很清楚 3.有合適的肢體語言顯得不死板 ### 可改進的地方 [1:30](https://youtu.be/8QrihLMbbxE?si=1v2yQ3O4ZO6OP_nj&t=90):建議可以停頓觀察interviewer的反應,也許對方會提出質疑或是不同的看法 [1:10](https://youtu.be/LMiuK6xIDN4?si=0lsf97HqdBAKbirT&t=70): interviewee 應當向interviewer確認題目的條件,否則可能不會知道所謂constraint ## 第二位同學([沙西米-Sashimi](https://hackmd.io/5JloIvXiT1q5C7YzepZI3g?both)) ### 關於interviewer ### 優點 1.很清楚的闡述interviwee的作法有什麼缺點(例如使用太大的記憶體或linked list 長度可能不一致),而不是單純評論"好"或"不好",也可以讓interviwee知道哪裡可以改 2.語速適中,英文發音也很清楚 3.有提出更進一步的問題要求interviewee現場解決(第二題) ### 可改進的地方 [1:31](https://youtu.be/LaV81zs_EM0?si=RRo2kYIO657GKfus&t=91),[1:07](https://youtu.be/ohBt69LbsrY?si=dAR7MCm27qU_IqT_&t=67): 建議interviewer可以要求interviwee 先提出預計的作法或是構想,若是直接讓interviwee寫code ,interviwee不見得有想法或是不一定是正確的作法 [10:29](https://youtu.be/LaV81zs_EM0?si=xYCnj9n3waAQi6qc&t=629),[10:46](https://youtu.be/ohBt69LbsrY?si=feCPyjcaxKay9utw&t=646): interviewee完成後,interviewer可以給一些評論或是討論,讓interviewee做ˇ哦是否正確或是有可以需要改進的地方。 [0:26](https://youtu.be/3IrwM1HSLoI?si=tyEXrtLgk5B-T7x9&t=26): 如果直白地把題目闡述出來,加上有關鍵字"linked list","加法",建議可以包裝成另一情境,避免出現背答案導致鑑別度不足,也可以考驗interviewee的理解能力和應變能力 ### 關於interviewee ### 優點 1.對於針對題目的repeat 和 example很清楚詳細 2.完成程式後有做test來驗證程式碼是對的 ### 可改進的地方 [3:12](https://youtu.be/ohBt69LbsrY?si=qQRWaIQm0GuxOCtK&t=192): 這一段停頓得比較久,可能可以說點什麼來避免對方失去興趣和專注 ## 第三位同學([克勞迪(Cloudy)](https://hackmd.io/@sysprog/H1hglOTy6)) ### 關於interviewer ### 優點 1.對題目的闡述都很清楚,儘管沒有舉例也能讓人立刻理解 2.[15:51](https://youtu.be/N4eiA2HKRUc?si=fgGrIjkelFlSnEYZ&t=951)有針對作法提出改善的可能方案,而不是簡單的說"請降低時間複雜度" ### 可改進的地方 [3:53](https://youtu.be/N4eiA2HKRUc?si=v1aj8GI03CKX_qpA&t=244):"聽起來沒什麼問題"可能會有給人一種好像沒什麼在聽的感覺,建議可以對interviewee的想法提一些問題或是討論 [12:42](https://youtu.be/N4eiA2HKRUc?si=3Pu7ieTE2XGa-axQ&t=762),[0:33](https://youtu.be/icIoCbfhwb8?si=rC-9YcEjyt9w0epf&t=33):建議可以把題目包裝成另一情境,避免出現背答案導致鑑別度不足,也可以考驗interviewee的理解能力和應變能力 ### 關於interviewee ### 優點 1.對於針對題目的repeat 和 example很清楚詳細 2.主動分析與討論時間複雜度和空間複雜度 ### 可改進的地方 [3:51](https://youtu.be/N4eiA2HKRUc?si=q2E9r68KtBXNE4jv&t=231): 所闡述的做法較為複雜且抽象,建議可以搭配一個實際例子來做講解 [6:00](https://youtu.be/N4eiA2HKRUc?si=M7sBEpuR7xBEB-Cx&t=390),[11:15](https://youtu.be/N4eiA2HKRUc?si=PorvxEN0zX-zLn01&t=677)(每一段打code):在打code的時候建議搭配講解,否則interviewer要會一直盯著code 容易不耐煩且無法進入狀況,也可以嘗試以寫一兩句講解一次開始 *比較缺乏REACTO 的test 部分(漢語) ## 第四位同學([卑鄙葛摟-Babygirl](https://hackmd.io/fIpt9MB8QxWEgRRDO0qW5w?view)) ## interviewer ### 優點 1.有提點interviewee應注意的細節 2.有提問兩種做法的相異處,可以測試到interviewee對程式的了解,而不是死背。 ### 可改進之處 [7:42](https://youtu.be/p5--6z5rnvo?si=z3eY1MLudzhL3_AB&t=462),[5:21](https://youtu.be/e0xsQr8mT3s?si=0VplKtVhVBPqEhFP&t=321): 感覺可以先對interviewee目前寫好的code做評論或提問,再請他優化,可能會比請他直接提供另外一種做法要更好 [0:08](https://youtu.be/e0xsQr8mT3s?si=IVjKj75oolHPmcRN&t=8):建議可以把題目包裝成另一情境,避免聽到關鍵字就開始背答案導致鑑別度不足,也可以考驗interviewee的理解能力和應變能力 ## interviewee ### 優點 1.邊打code邊講解的很順暢 2.[2:33](https://youtu.be/e0xsQr8mT3s?si=2xKOW1CJn-XAU1P8&t=153):將所舉的例子key出來很清楚詳細,讓人一看就明白 ### 可改進之處 可以增加一些肢體動作或停頓(加強)來讓自己的整段對話重點更加突出。 較為缺乏REACTO的 Test部分(英) ## 第五位同學([佛萊迪 Freddy](https://hackmd.io/FN71R9uVRq2TCW64yZPVkg?view)) ## interviewer ### 優點 1.有直接根據code 給出公司的要求,要求interviewee做進一步優化討論 2.問題闡述詳細 ### 可改進之處 [14:06](https://youtu.be/uaA_eWw3Rxk?si=CKOJaV1pwtTJxdQF&t=846): 如果只問"你有其他辦法嗎",若是在撰寫過程中沒有發現或想到其他辦法的話,此時還是一頭霧水,所以interviewer可能可以指出特定的點,要interviewee做出優化 [0:08](https://youtu.be/VvXsyD1LtiQ?si=frVMS0ugPcq5shSN&t=8):開頭有點太像主持一個show,會給人一種不太認真(嚴肅)的感覺 在英語口說的時候,一句話中"強調"的字通常是關鍵字,但同學"強調"的字眼卻可能是連接詞或語助詞,會比較無助於抓重點。 ## interviewee ### 優點 1.分析時間複雜度時的分析很清楚詳細,不會只吐出一個答案 2.有主動做Test ### 可改進之處 [3:45](https://youtu.be/uaA_eWw3Rxk?si=PzjHd6NrJ6o0X82U&t=225):建議可以停頓觀察interviewer的反應,也許對方會提出質疑或是不同的看法 在邊打code 邊解釋的時候可以更有自信一些,避免一些思考時的贅字,會顯得對自己的東西不太確定,以及與其卡在一個詞,不如放慢語速想好再講完。 在打code 的時候,有時候會變成喃喃自語 # 二,模擬面試部分 >[video](https://youtu.be/Ukefw7g95XY) 🧔 : 你好,歡迎你來到我們公司,公司請我今天來與你進行面試,接下來我會提出一些問題,希望你可以依照你的經驗來提出解決方案和我一起討論。 今天,公司拿到兩串產品型號的清單,個別已經由小排到大了,想請你提出一個將按照大小將兩個清單整理在一起的方法。 這兩個清單會以linked list的資料型態存在。 👶 : 請讓我整理一下問題,我會拿到兩個已經排序過的list,接著我要由小到大合併這兩個list嗎 🧔 : 沒錯。你的理解是對的。 👶 :舉例來說: list1: [4 ,8 ,9] list2: [1 ,4 ,7] ----> [1,4,4,7,8,9] 另外我需要考慮會有空的list 的情況嗎 🧔 :你舉的例子正確無誤,並且需要考慮會有空list 的情況。 接下來請你提出你會用什麼策略進行 👶 : 直觀的方式我會想用迭代的方法。會使用 while 迴圈走遍兩個LIST並比較兩個目前節點的值,然後決定將哪個節點新增到合併後的list中。 🧔 : 這會是最直觀的方式,請你用程式實作。 👶 : ```cpp= 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跑到最後。 🧔 :請你用實作出來並討論兩個方法的差異 👶 : ```cpp= 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](https://youtu.be/Ukefw7g95XY?t=387)詢問作法上的差異可以避免死背程式碼的部分,也可以知道 Interviewee 為什麼選擇此演算法,問得很好 * 最後 Interviewer 應該要對 Interviewee 做出回應,後面結束的有點突然