# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023)」作業 1
> 嚐味鹽-Yuanson
> video: [模擬面試影片(漢)](https://youtu.be/wgwVsviTdcI)、[模擬面試影片(英)](https://youtu.be/W-4wPJFCWyo)
> 🧔:interviewer
> 👶:interviewee
## [17. Letter Combinations of a Phone Number](https://leetcode.com/problems/letter-combinations-of-a-phone-number/)
### 測驗說明與問答
🧔:你好,我是今天負責主持面試的David
👶:你好
🧔:希望你可以實作以下題目,有一串數字2~9的字串,每個數字都包含了一些字母,例如2可能表示a,b,c,在給你一串數字的情況下,返回這一串數字可能表示的所有字母組合,下面會給你對應的表格。
\begin{bmatrix}
2 : a,b,c\\
3 : d,e,f\\
4 : g,h,i\\
5 : j,k,l\\
6 : m,n,o\\
7 : p,q,r,s\\
8 : t,u,v,w\\
9 : x,y,z
\end{bmatrix}
👶:好的,我想再跟您確認一下題目的要求,2代表的是a,b,c,3代表的是d,e,f,如果現在有一串數字是23,我應該要表示出這兩個集合能表示出的所有組合嗎,像ad,ae,af,bd,be,bf...
🧔:你的理解是正確的。
👶:嗯...,我預計一開始會使用一開始會使用字典來記錄每個數字對應的字母,後續用一個迴圈來偵測每一輪的數字和其對應的字母,從第一個數字開始逐步將字母組合起來找出答案
🧔:聽起來不錯,你可以開始了
👶:好
```python
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if digits=="":
return []
space={
'2':["a","b","c"],
'3':["d","e","f"],
'4':["g","h","i"],
'5':["j","k","l"],
'6':["m","n","o"],
'7':["p","q","r","s"],
'8':["t","u","v"],
'9':["w","x","y","z"]
}
ans = space[digits[0]]
for i in range(1,len(digits)):
ans = [char1 + char2 for char1 in ans for char2 in space[digits[i]]]
return ans
```
🧔:恩 還不錯 但有沒有速度更快的辦法
👶:痾 我想想,我預計會用遞迴的方式寫出一個function,先從最尾端偵測數字,將其代表的字母回傳後再與前一個數字的字母組合,逐步推出答案
🧔:你可以開始了
```python
class Solution(object):
def letterCombinations(self, digits):
"""
:type digits: str
:rtype: List[str]
"""
if digits=="":
return []
space = {
'2': ["a", "b", "c"],
'3': ["d", "e", "f"],
'4': ["g", "h", "i"],
'5': ["j", "k", "l"],
'6': ["m", "n", "o"],
'7': ["p", "q", "r", "s"],
'8': ["t", "u", "v"],
'9': ["w", "x", "y", "z"]
}
def generate_string(i):
if i == len(digits):
return [""]
previous = generate_string(i + 1)
new_string = []
for letter in space[digits[i]]:
for string in previous:
new_string.append(letter + string)
return new_string
```
## [205. Isomorphic Strings](https://leetcode.com/problems/isomorphic-strings/)
### 測驗說明與問答
🧔:很好,那那在第二個問題中,題目提供兩個字串s跟t,他們的長度都是相同的,你需要判斷他們是不是同構的,像add跟egg這種,如果是add跟geg雖然字母數量對的上,但他們不是同構的,同時還要滿足一些條件,像假如a對應到e,那d就不能再對應到e
👶:好的,所以我需要確認兩個字串是不是同構來回傳true or false,如果只是對應字母的數量相同,但位置不一樣的話也不算同構嗎
🧔:沒錯
👶:恩,那我會先寫出兩個字典來記錄每個字分別對應到哪個字,後續寫一個迴圈來依序判斷兩者是否相等,如果是第一次出現的字,會先檢查對應的字有沒有被使用過,沒有的話會將這兩個字母記錄在字典中,後續再出現相同字母的話,再來判斷他們對應的跟字典上記錄的是不是一樣的,最後判斷結果
🧔:好~你可以開始了
```python=
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
space_s=defaultdict(str)
space_t=defaultdict(str)
for char_s,char_t in zip(s,t):
if space_s[char_s]=="":
if space_t[char_t]!="":
return False
space_s[char_s] = char_t
space_t[char_t] = char_s
elif space_s[char_s] != char_t or space_t[char_t] != char_s:
return False
return True
```
🧔:還不錯,但顯得有點複雜,有沒有方法可以幫助你簡化這段程式碼呢
👶:恩...我知道了,我馬上就可以實作
🧔:好的,請隨時開始
```python=
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
zipped = set(zip(s, t))
return len(zipped) == len(set(s)) == len(set(t))
```
🧔:恩,你表現得很好,請隨時留意信箱有關第二次英語面試的通知
## [485. Max Consecutive Ones](https://leetcode.com/problems/max-consecutive-ones/description/)
### 測驗說明與問答
🧔:Hello, Yuanson, I'm David. Welcome to the second round of the interview. Let's get started
👶:hi, i'm ready
🧔:ok,Here's question,given a binary array nums, return the maximum number of consecutive 1's in the array.
👶:Alright, it's a binary array, so I'll have an array that consists only of 0s and 1s, and I need to find the length of the longest consecutive sequence of 1s.
🧔:right
👶:I guess I could use a for loop to iterate through the entire string. I'll use two variables: one for the current length and another for the maximum length. Whenever I encounter '1', I'll increment the current length; if I encounter '0', it will reset to zero. I will compare the current length with the maximum length and update the maximum length
🧔:sounds good, feel free to code it
```python=
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
ans = 0
temp = 0
for i in range(len(nums)):
if nums[i] == 1:
temp += 1
else :
ans = max(ans,temp)
temp = 0
ans = max(ans,temp)
return ans
```
🧔:good, Is there any way to speed up the program?
👶:Ummm, sure I can do it
```python=
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
ans = 0
temp = 0
for i in nums:
if i == 1:
temp += 1
else :
ans = max(ans,temp)
temp = 0
ans = max(ans,temp)
return ans
```
🧔:Well done, please wait for the following email
👶:thank you
# 自評
- 談話過程
- 聲音忽大忽小不固定
- 語速跟咬字可以再加強
- 應在程式設計的環節有更多溝通,包含程式複雜度、可讀性等問題都可以討論
- 術語可以再練習
- 盡量把細節都想好,再開始談話,可以有點停頓
- 英文的部分口齒不清更明顯,需加強
- 程式部分
- 練習如何邊打邊解釋自己對程式的想法,又或是打完再完整講解
- 部分程式碼可以再精簡
# 他評-01
## interviewer
### 可改進之處
- [3:56](https://youtu.be/wgwVsviTdcI?t=236): 有沒有速度更快的方法這裡,可以說明要朝著哪個方向改進
- [8:44](https://youtu.be/wgwVsviTdcI?t=524): 可以改成能不能用python語法來達到先前程式碼的效果
## interviewee
### 優點
- [0:53](https://youtu.be/wgwVsviTdcI?t=53): 那個思考的眼神相當到位
- 在撰寫程式碼時,有說明這段程式的用途
### 可改進之處
- [0:31](https://youtu.be/wgwVsviTdcI?t=31): 在說明例子時,可以配合圖解來說明,會比較清楚
# 他評-02
## interviewer
### 優點
- 將205.融合,直接當作17.的後續討論
### 可改進之處
- 題目不應該只有口頭講
## interviewee
### 優點
### 可改進之處
- 舉例應該邊講邊打在螢幕上
- 應該用Google文件等沒有自動補齊的工具撰寫
- [6:32](https://youtu.be/KYugQe23BTc?si=dR-DmO618zMDdD9f&t=6m32s): 沒有舉例何謂同構
- 都沒有說明時間和空間複雜度
- [2:25](https://youtu.be/W-4wPJFCWyo?si=fXyzoQ5in6ogFzEr&t=2m25s): 沒有解釋更快速的方法是什麼,直接說"I can do it.",而且使用的方法時間複雜度是一樣的
17.
```cpp=
class Solution {
public:
const vector<string> pad = {
"", "", "abc", "def", "ghi", "jkl",
"mno", "pqrs", "tuv", "wxyz"
};
vector<string> letterCombinations(string digits) {
if (digits.empty()) return {};
vector<string> result;
result.push_back("");
for(auto digit: digits) {
vector<string> tmp;
for(auto candidate: pad[digit - '0']) {
for(auto s: result) {
tmp.push_back(s + candidate);
}
}
result.swap(tmp);
}
return result;
}
};
```
```cpp=
class Solution {
private:
void letterCombinations(string digits, vector<string>& output, string &temp, vector<string>& pad, int index){
if(index == digits.size()){
output.push_back(temp);
return;
}
string value = pad[digits[index]-'0'];
for(int i=0; i<value.size(); i++){
temp.push_back(value[i]);
letterCombinations(digits, output, temp, pad, index+1);
temp.pop_back();
}
}
public:
vector<string> letterCombinations(string digits) {
if(digits.empty()){
return {};
}
vector<string> pad = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> output;
string temp;
letterCombinations(digits, output, temp, pad, 0);
return output;
}
};
```
205.
```cpp=
class Solution {
public:
bool isIsomorphic(string s, string t) {
unordered_map <char , char> rep;
unordered_map <char , bool> used;
for(int idx = 0 ; idx < s.length() ; idx++) {
if(rep.count(s[idx])) {
if(rep[s[idx]] != t[idx])
return false;
}
else {
if(used[t[idx]])
return false;
rep[s[idx]] = t[idx];
used[t[idx]] = true;
}
}
return true;
}
};
```
# 他評-03
## interviewer
### 優點
- 敘述題目時口頭清晰
### 可改進之處
- [3:54](https://youtu.be/wgwVsviTdcI?si=m2ikQrI6k15j8ZXZ&t=234): 這裡可以請受試者分析一下自己寫的程式,分析完後適當引導受試者改善他的程式
## interviewee
### 優點
- 表達清晰,React 以及 Example 做的很到位
### 可改進之處
- 雖然 React 以及 Example 表達清晰,但是應透過螢幕來實際舉例子會更加清楚
# 他評04
## Interviewer
- [ ] 可以改進的部分
* 第一題討論優化時,面試官讓面試者提出改善的解法後,應該要先要求使用者分析時間複雜度來證明真的有優化的效果,而非直接讓面試者進行實作
* 第一題寫完後應該要跟面試者有更多的討論,像是舉例驗證實作的正確性,或是效能的改善等等,而非直接跳下一題
## Interviewee
- [ ] 可以改進的部分
* 請不要把「d」念成「豬」
* [3:28](https://youtu.be/wgwVsviTdcI?si=i_NKMQaJUG5Rx9Ma&t=208) 面試者講說要利用 Python 語法寫一個巢狀迴圈,可以直接講出是利用 Python 的 [list comprehension](https://www.w3schools.com/python/python_lists_comprehension.asp)
* 第一題應該要先解釋為何需要額外撰寫 inner function `generate_string(i)`,解釋這個 function 的功能,然後才開始實作
* 第一題的第二種作法有明顯的錯誤,inner function `generate_string` 沒有被呼叫到,且 `digits` 非空時沒有回傳值
* 第一題的第二種作法看起來只是換個語法寫,不太懂為什麼會有加速的效果,面試者應該要解釋
* 三題都沒有確實進行 REACTO,尤其是 Test 和 Optimization 的部分,無法呈現程式碼實作的正確性,且 Optimization 不應該只是在玩語法糖,應該要有更深入的效能分析和比較
# 他評-05
## interviewer
### 優點
* 會給予 interviewee 肯定
### 可改進之處
* 應該給題目的文字說明(google doc之類的...)
* 詢問"速度更快的方法之前",可以先請 interviewee 說明原先 code 的 complexity 再詢問能否有更簡便或更快速的解法。
* [8:48](https://youtu.be/wgwVsviTdcI?t=528)這邊 interviewee 還沒有說明要怎麼改進就直接讓他實作,應該先讓他說明他的想法,再從同事或是 co-work engineer 的身分跟他討論,最後有共識再實作。
## interviewee
### 優點
* 有說明自己要怎麼實作,且實作前也有先確認一些題目上的疑慮。
* 有一邊撰寫程式一邊說明程式碼之意義。
* 題目都很快就想出解法。
### 可改進之處
* 沒有做 REACTO 的 Test,應該要跑跑看測資或自己想測資代入試試看程式碼正確性。
* 字典可以不用全列出來,interviewer 應該更在意的是解題的邏輯、想法,全列出來有一點冗,可以改用部分或 pseudo code 代替即可。
* [8:48](https://youtu.be/wgwVsviTdcI?t=528)這邊沒有說明要怎麼改進。