# 2023 年「資訊科技產業專案設計」作業二
>卑鄙葛摟 Babygirl
---
# 作業他評
## 貢獻者:[沙西米-Sashimi](https://hackmd.io/@sysprog/S1hhirak6)
### 關於interviewer
#### 優點
- 說話清晰
- 有針對 interviewee 的程式碼提出相關的問題
#### 可改進的地方
- Merge Two List 還可以再做更深入的討論
### 關於interviewee
#### 優點
- 有做 repeat 和 example 的動作,與 interviewer 確認題意
- [6:53](https://youtu.be/ohBt69LbsrY?si=nHetM9Jo-3-HPj27&t=413): 程式碼有用註解做解釋,讓 interviewer 更容易理解
- 英語口說清晰
#### 可改進的地方
- [4:22](https://youtu.be/LaV81zs_EM0?si=DWGCqUZyO8GD69KN&t=262): 這邊說『我想一下』感覺很唐突
- [2:25](https://youtu.be/ohBt69LbsrY?si=m6PqVVR_c-x_a9Mq&t=145): 留白好多,可以講解一下正在寫的程式
## 貢獻者:[吸鎖-seesaw](https://hackmd.io/@sysprog/HkYZxdayp)
### interviewer
#### 優點
- 有引導 interviewee 降低時間或空間複雜度
#### 可改進之處
- 可以包裝題目,避免聽到關鍵字就讓 interviewee 背出答案
### interviewee
#### 優點
- [12:56](https://youtu.be/DDvWYRLwvGs?si=jY7iNRayRl1mvMoF&t=776) ~ [14:53](https://youtu.be/DDvWYRLwvGs?si=4z4HyBiY1ygn--aN&t=893): 這邊的舉例講解很清楚詳細,讓人一看就明白
- 英文表達清楚
#### 可改進之處
- [6:11](https://youtu.be/DDvWYRLwvGs?si=V6cdmO0OOkyaDRe-&t=371) ~ [6:57](https://youtu.be/DDvWYRLwvGs?si=V6cdmO0OOkyaDRe-&t=417): 表達的有點混亂,可以想好再講
## 貢獻者:[抹茶-Matcha](https://hackmd.io/@sysprog/SJOekLTyp)
### interviewer
#### 優點
- 說話清晰
#### 可改進的地方
- 不該自稱是「面試官」,這樣會有「上對下」的隱含意思
- 建議將題目包裝成其他應用的場景,避免出現背答案導致鑑別度不足,也可以考驗 interviewee 的理解能力和應變能力
- 可留一點問題讓 interviewee 問,例如說先不講變數限制,看看 interviewee 是否有思考邊界條件
### interviewee
#### 優點
- [2:54](https://youtu.be/mgyhMfmlL-o?si=OuyEpP3gyt2q1jgt&t=174) 有清楚表達解決問題的思路,例如:為什麼會想用遞迴的方法來解
- 主動分析時間和空間複雜度
#### 可改進的地方
- 作答前應該先溝通使用的程式語言
## 貢獻者:[美生菜-Murphy](https://hackmd.io/@sysprog/HJzPbOaya)
### 關於 interviewer
#### 可改進的地方
* 可對 interviewee 目前寫好的 code 作出提問
* 題目可以包裝一下
### 關於 interviewee
#### 優點
* 說話清晰
#### 可改進的地方
* 沒有做到 REACTO 的 E
* 先對 interviewer 說明解題方法再開始撰寫 code
#### 其他建議
影片的畫面內容字太小,看不清楚程式碼的部分
## 貢獻者:[盲狗-Mango](https://hackmd.io/@sysprog/Syvm18aka)
### interviewer
#### 優點
- 與 interviewee 的互動很好
- 發問精簡,也有引導 interviewee 優化
#### 可改進的地方
- 題目可再做些包裝
### interviewee
#### 優點
- 依循 REACTO 流程,有將 Approach 充分討論
- 邊講解例子邊寫出來,讓人容易理解
#### 可改進的地方
- 英文解說有點卡卡的
# 自我檢討
## interviewer
- 避免直接用 LeetCode 原題,應用實際情景帶出題目來解決問題,避免interviewee背答案
- 對 interviewee 目前寫好的 code 做評論或提問
## interviewee
- Repeat: 確認題意時,把重點 constraint 打出來
- Examples: 舉例一些符合案例的情景,將案例應用在情景上,讓 interviewer 覺得你知道怎麼解決問題,解決過什麼問題,懂得應用
- Approach:
- 把觀念和做法清楚簡潔地打下來
- 把步驟打下來,在寫程式碼時,按照步驟撰寫跟說明會更清楚
- Code: 使用範例並加上註解來解釋程式碼,讓 interviewer 更好理解
- Test: 拿範例驗證程式碼 $\Rightarrow$ 在作業一沒做到
# 模擬面試
## [234. Palindrome Linked List](https://leetcode.com/problems/palindrome-linked-list)
> 🧔:interviewer 👶:interviewee
> [模擬面試影片(漢)](https://youtu.be/jXdx-T9Nwe4)
### 測驗說明與回答
🧔:HI,Babygirl,今天由我來主持這場面試,那我們就開始吧。這裡我先描述一個情境,當我們在用不同裝置登入社群帳號時,會需要在使用者手機上做驗證碼認證,驗證碼的每個字皆為正整數,假設今天有個特別的線上抽獎活動,你的任務就是設計一個檢查機制,如果使用者輸入的驗證碼正讀跟反讀都是一樣的話,就可以參加線上抽獎。
👶:好的,所以我的任務是依序讀入一串正整數,其中每個數字的範圍是 0 ~ 9,然後檢查它是否為迴文。
🧔:對,你的理解沒錯。
👶:舉個例子來說,假設使用者輸入的驗證碼為`[1,2,2,1]`,我的程式應回傳 `true` ,若輸入的驗證碼為`[1,2]`,那麼應回傳 `false`,這樣的例子是對的嗎?
🧔:對的,你會想怎麼設計這個檢查機制呢?
👶:我認為這個情況可以使用 linked list 來儲存輸入的驗證碼,首先我會使用一個指標遍歷 linked list 並將每個數字 push 到一個 stack,接著再從 stack 的頂端 pop 每個數字出來,與 linked list 做比對,如果都相同即可回傳 true。
🧔:聽起來是可行的,你可以開始實作了
👶:好的,我會用 C++ 進行實作
```cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* };
*/
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head==NULL) return true;
ListNode* curr = head;
vector<int> stack;
while(curr!=NULL)
{
stack.push_back(curr->val);
curr = curr->next;
}
curr = head;
while(curr!=NULL)
{
if(curr->val != stack.back()) return false;
curr = curr->next;
stack.pop_back();
}
return true;
}
};
```
👶:(利用`[1,2,2,1]`進行驗證)
👶:因為遍歷了列表,所以時間複雜度是O(n)。因為額外使用了一個 stack 存放所有的元素,所以空間複雜度也是O(n)
🧔:這邊有沒有辦法再做優化,例如降低空間複雜度?
👶:可以,可以改成用兩個指標來做。主要分成三個步驟,第一步驟會用 slow 和 fast 指標找到 linked list 中間的 node 來切成兩段,第二步驟將後半段的 linked list 做反轉,第三步驟則是將前半段的 linked list 與後半段做反轉的 linked list 做比較,如果都相同即可回傳 true。
```cpp
class Solution {
public:
bool isPalindrome(ListNode* head) {
if(head==NULL) return true;
// Step 1
ListNode* fast = head;
ListNode* slow = head;
while(fast!=NULL && fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
}
// Step 2
ListNode* prev = NULL;
ListNode* curr = slow;
while(curr!=NULL)
{
ListNode* forward = curr->next;
curr->next = prev;
prev = curr;
curr = forward;
}
// Step 3
ListNode* first = head;
ListNode* second = prev;
while(second!=NULL)
{
if(first->val!=second->val) return false;
first = first->next;
second = second->next;
}
return true;
}
};
```
👶:(利用`[1,2,2,1]`進行驗證)
👶:這樣子空間複雜度就可以降到O(1)
### 他評01
#### 優:
[0:35](https://youtu.be/jXdx-T9Nwe4?t=35) 有情境描述。
[1:08](https://youtu.be/jXdx-T9Nwe4?t=68) er引導ee解決問題。
[1:23](https://youtu.be/jXdx-T9Nwe4?t=83) 使用steps來清楚說明步驟。
#### 可改進:
[1:59](https://youtu.be/jXdx-T9Nwe4?t=117) steps可以打個大概就好,不用打那麼詳細,節省時間。像是「每個數字從stack的頂端pop出來」寫成「stack pop」就好了。
[18:01](https://youtu.be/jXdx-T9Nwe4?t=1079) 驗證的時候,可以也驗證有奇數個數的list。
## HW4 他評02
### 可改進
### Interviewee
[01:24](https://youtu.be/jXdx-T9Nwe4?t=84): linked list 聽起來像link id list,讀起來應該像lingkt list
[02:44](https://youtu.be/jXdx-T9Nwe4?t=164): 「存放是另一個指標」,應該是存放下一個結點的地址,而不是指標。
[16:50](https://youtu.be/jXdx-T9Nwe4?t=1010): 這邊可以再探討如果是奇數個驗證碼呢(ex.[1,2,1])?中間定義是指哪一個?
[16:53](https://youtu.be/jXdx-T9Nwe4?t=1013): step2因為程式碼其實也不多且也直覺,但因為是測試,應該直接利用其中的變數去解釋如何達到反轉,直接說結果的感覺變成是假設是對的情況。
[17:59](https://youtu.be/jXdx-T9Nwe4?t=1079): 時間複雜度也講一下
### Interviewer:
[08:37](https://youtu.be/jXdx-T9Nwe4?t=517) 總結問到的問題就是優化而已,優化的方法其實容易背誦
其實就可以要求使用者解釋極速驗證碼的情況,中間要切的時候怎麼切
缺延伸問題
[00:16](https://youtu.be/jXdx-T9Nwe4?t=16): 「每個數字都為正整數」,厚棉提到0~9,正整數不含零
### 優點:
### Interviewee: 在寫出程式碼之前都清楚的解說自己的想法而且編寫程式碼邊講話的節奏很好,清楚
* 自信,語速穩定
## HW4 他評03
### 優點
- 有透過step說明自己處理問題的順序,幫助面試官更簡單地去了解。
### 可改進地方
- 面試官可以多問一些問題,讓面試者去回答來增加互動,避免都是面試者在講。