# 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)這邊沒有說明要怎麼改進。