---
# System prepended metadata

title: Untitled

---

# 2023 年「資訊科技產業專案設計」作業 2

## 從 作業他評 學到甚麼

* 評 Yuanson
    * REACT 中的 TEST 的重要
    * 實作前要說明想法
    * 分析自己程式碼
* 評 tianbing
    * REACT TEST 的重要
    * 一樣，實作前要說明想法
* 評 satoru
    * 可以先口頭 go throught 整個過程再實作。
* 評 leg
    * 可以更實際的舉例
    * 程式邏輯的說明需再加強
* 評 Marlin
    * interviewer 可以問更深入、專業的問題讓 interviewee 去思考，才能更好的看到 interviewee 的程度。
    * 須對程式碼做更深入的分析。

---


## Interview
> [Leetcode 17](https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/)
> [google doc](https://docs.google.com/document/d/1NGzAiDVWiGpdCA2hHFFJjg0lRKipEJwx4tkPxFiu2ig/edit?usp=sharing)
> [video link](https://youtu.be/0iNEO8LyyuA)，前一個連結上傳錯影片了QQ
> 

:::info
:male-office-worker: Interviewer；:male-student: Interviewee
以下內容擷取自對話，並刪減一些冗詞贅字以方便閱讀。
:::

:male-office-worker:: Hello James, 我是 Jason, 可以聽到我的聲音嗎?
:male-student:: Hello Jason, 可以，很清楚。

:male-office-worker::請你打開會前分享給你的文件，裡面有此次面試題目。
:male-office-worker::這次問題是我們的產品因為一些技術上的限制，所以利用數字去 mapping 到字母，例如 2 ->"abc", 3->"def",...,9->"wxyz"這樣。
:male-office-worker::那因為客戶想要先對input所產生的所有字串可能的組合做篩選，抓有意義的字詞來建立辭典，以利後續快速查找，因此你要做的就是將input的數列轉成所有可能的組合。
:male-student::好的，那麼首先我會先建立數字對字母的字典，並利用迭代查詢字典建立所有組合。

### code

```c++
vector<string> numStr={
    “abc”,
    “def”,
    // …
    “tuv”
    “wxyz”
}
vector<string> letterCombination(string input){
    vector<string> ans;
    int numTotal =1;
    for(int i=0;i<input.length();i++){
        numTotal *= 數字代表的字典長度
    }
    // numTotal = 9
    for(int i=0;i<numTotal;i++){
        string num =””;
        int k=i;
        for(int j=0;j<input.length();j++){
            int n = numStr[input[j] - ‘2’].size(); // n=3
            int d = k%n; d=0
            char digit = numStr[input[j]-’2’][d]; 
            num.push_back(digit);	// vt ut tt
        }
        ans.push_back(num);
    }
    return ans;
}


```

:male-office-worker::這個方法雖然複雜但挺直覺的，不錯，能否分析一下。
:male-student::好的，那麼這份程式碼空間和時間都會bound在輸入的數列的長度，已知對長度有限制，因此並不會長得太大(不會沒效率)。但是要若要考量數列的長度會更長，大於5的話，空間和時間就有可能會呈現指數成長。

## 第四次作業- 他評01:
* [0:01](https://youtu.be/0iNEO8LyyuA?si=ukAt-qfPr3jQOSK0&t=1) 多餘的部分記得要剪掉。
* 在interviewer以及interviewee切換有點過快，聲音會被切到。
### 針對interviewer:
* [1:41](https://youtu.be/0iNEO8LyyuA?si=atYmJoZnezhVOcxb&t=107) 我認為問題包裝的部分在說明設計此系統的原因時可以有更具體的說明(例如: 快速存取，何謂快速)、或者是題目可以不要先訂死，先交給interviewee 去思考解決方法，再去做進一步的引導。
* [20:49](https://youtu.be/0iNEO8LyyuA?si=Vo5bzm-dCJwsl1ss&t=1249) 如果認為現在公司的困境正如受試者的問題相同，那應該要去引導受試者嘗試提出解決方法(例如: 這個系統會因為字母數增加時間複雜度會呈現指數型成長，那你有其他辦法可以解決此問題嗎 等等的)。

### 針對 interviewee:
```c++
vector<string> letterCombination(string input) {
vector<string> ans;

if (input.empty()) {
return ans;
}

int numTotal = 1;
for (char digit : input) {
int digitIndex = digit - '2';
numTotal *= numStr[digitIndex].size();
}
```
* 在上述程式碼的for loop之後可以加上這一行 ans.reserve(numTotal);，加上這一行主要的好處在於避免動態陣列的重新分配。當你往 ans 中添加新元素時，如果 ans 的容量不足，就需要進行重新分配和拷貝，這樣的操作會帶來額外的時間開銷。
