# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023)」作業 1 > 貢獻者: 布萊德 - bread >🐻: interviewer >🐼: interviewee > > [漢語-1](https://youtu.be/BdGYZS2hdS0) > [英語-2](https://youtu.be/fReaddafNTY) > [漢語-3](https://youtu.be/WkNf8ZuICdo) ## [1. Two Sum](https://leetcode.com/problems/two-sum/description/)(漢) 🐻:歡迎來到這次的面試,這次的面試內容是希望你做出畫面上的這道題目 🐼:好的我剛剛有看完題目了,想確認題目的整體方向 🐼:我是要從`nums`裡面找出兩個元素,其相加起來等於`target`,並且把這兩個元素的索引回傳對嗎 🐻:對的沒錯 🐼:那假設說,我現在有兩個例子,他們的 input 與 ouput 如下面所示,這樣子的理解是正確的嗎 `[3,2,4], 6 return [1,2]` `[3,2,3], 6 return [0,2]` 🐻:嗯嗯沒錯,依照題目的意思是正確的 🐼:好的,那對這個題目的話,我的第一個想法是這樣子的: 🐼:首先透過兩層的迴圈,一一去加每個元素的組合並比對`target` 🐼:如果相等的話,就代表找到組合了,回傳這兩個的索引即可 🐼:那如果將這個方法實作成程式碼的話,就會是以下的樣子: ```python! for i in range(len(nums)): for j in range(len(nums)): sum = nums[i] if i != j: sum += nums[j] if sum == target: retrurn [i,j] ``` 🐻:好的,這樣看起能解決這個問題沒錯 🐻:但是這樣的方法有點太慢,你可以提供更快的方法嗎 🐼:這樣的方法因為會用到兩層迴圈,確實速度很慢 🐼:如果要優化的話,我們可以利用 dictionary 減少運算時間 🐼:我們可以把比對的對象變成 dictionary ,這樣就可以大幅減少查詢的時間 🐻:聽起來還不錯,那你可以把這個想法實作出來嗎 🐼:沒問題,那實作出來的做法大概就會像下面這樣: ```python! num_dict = {} for i,n in enumerate(nums): diff = target-n if diff in num_dict: return [num_dict[diff], i] num_dict[n] = i ``` 🐻:看起來還不錯,速度確實有改善 🐻:好的那今天的面試大概就到這邊結束,感謝你今天的參與 🐼:謝謝 ## [2215. Find the Difference of Two Arrays](https://leetcode.com/problems/find-the-difference-of-two-arrays/description/)(英) 🐻:Hi welcome to the second interview, I will be hosting this meeting. 🐻:And you'll be asked to solve the problom on the screen during interview. 🐼:Alright, I have read the question and I want to check something. 🐼:As the description said, we need compare `nums1` and `nums2`. 🐼:And we return a list of size 2 which: `answer[0]` are all distinct integers in `nums1` that not in `nums2` `answer[1]` are all distinct integers in `nums2` that not in `nums1` 🐼:Is that correct? 🐻:Yep, that's the case. 🐼:Okay! So if we take these input and output as examples: `[1,2,3] [2,4,6] return [[1,3], [4,6]] ` `[1,2,3,3] [1,1,2,2] return [[3],[]] ` 🐼:Will these make sense? 🐻:Yeah, that's looks pretty good! 🐼:Awesome! So the first thing came up to my mind is using for loops. 🐼:By checking each element in `nums1` and `nums2`, we can get the answers. 🐼:And by doing so, this is the code would look like. ```python! answer = [list(set([for I in nums1 if I not in nums2])), list(set([for j in num2 if j not in nums1]))] return answer ``` 🐻:Alright, looks pretty desent. But can you make it faster? 🐼:Yeah, so since we are using `set()` method in python, we can take advantage of that. 🐼:By using `set()` we can just use the operator `-` to do the work. 🐼:And the code would look like this. ```python! answer = [[set(nums1)-set(nums2)], [set(num2)-set(nums1)]] return answer ``` 🐻:Okay! Looks good to me! It does improve the performane of execuiton time. 🐻:So let's call it a day! Congrats, you did a great job. ## [2707. Extra Characters in a String](https://leetcode.com/problems/extra-characters-in-a-string/description/)(漢) 🐻:恭喜你來到這次的面試,這次面試也是希望你能實作出畫面上的這個問題 🐻:這個問題稍微困難一點,有問題的話隨時都可以跟我詢問 🐼:好的,那這個問題有點複雜,我想要確認一下我理解的對不對: 🐼:我需要把`s`分成若干個子字串,與`dictionary`比對 🐼:如果`dictionary`裡面有字詞是存在在`s`裡面的話,就需要把它去掉 🐼:重複這個動作,直到確定`s`裡面的字串是最短的,並回傳這個字串的長度 🐻:是的沒錯 🐼:好的那假設以這個例子來說,這樣子的邏輯是符合提議的嗎 `s = ‘leetscode’, dictionary= [‘leet’, ‘code’] ` `[‘s’] retrun 1` 🐻:沒錯喔,這樣的例子是有符合題意的沒錯 🐼:好的非常感謝,那這樣的話我想到的方式是用dp的方式去實作 🐼:主要是從右至左以迭代的方式掃描`s`,再透過動態改變儲存好的值來做到更新 🐼:那以寫成程式碼的話,大概會是像以下這個樣子: ```python! dp = [0] * 51 n = len(s) for i in range(n-1, -1, -1): dp[i] = 1 + dp[i+1] for w in dictionary: if (i + len(w) <= n) and s[i:i+len(w)] == w: dp[i] = min(dp[i], dp[i + len(w)]) return dp[0] ``` 🐻:好的,看起來還不錯,不過這樣的方法速度有點慢 🐻:但我們今天的時間也差不多了,你有沒有什麼改善這個缺點的想法呢 🐼:如果是改善速度的話,我第一個想法是透過DFS的方法 🐼:以及利用cashe的方式來避免重複收取儲存的內容 🐼:這樣的話理論上可以改善上一個方法在速度上的劣勢 🐻:好的,這樣子的方法聽起來確實是可以比較快 🐻:那今天的時間也差不多了,感謝你今天的參與 ## 總體初步檢討 * 因為我的基礎與真正資工出身的人相比之下非常不足,所以其實光在寫 leetcode 的題目就有很大的問題了。這也導致我在開始模擬面試前就花了一段時間理解題目和解法,也讓我在完成這個作業的心力有許多都消耗在基礎的先備能力上,而這樣的不足也體現在模擬面試的過程上。 * 語速可能太快,講出來的東西有時候會因為還沒有想好而發生「不斷修正」的情況,可能要調整一下語速。 * 常常為了做到 REACTO 的步驟,而一直講述自己的想法,不知道這樣是否會讓面試官覺得自己太多話。 * 因為基礎不足的關係,所以其實重錄了幾次並且錄影前練習了幾次,但真正的面試過程不會那麼容易事前準備,要再注意。 * 不知道為什麼聽起來超gay... --- ## 第二次作業-他評 01 ### interviewer * 有提供文字題目給interviewee,很棒!不過如果能再搭配著一些解說會更好! * 給題目的時候可以試著把情境帶入而不是直接出題。 * interviewer的聲音有點過小,有時候會聽不清楚在說甚麼 * interviewer與interviewee的互動有點少,像是在說明請提供更快解法的時候,可以更有引導性,像是原本慢在哪,可以往哪個方向調整來讓interviewee抓到可以優化的地方 ### interviewee * 有在寫程式的時候邊說明程式,不錯! * [1:08](https://youtu.be/BdGYZS2hdS0?feature=shared&t=68): 可能要注意一些摸鼻子之類的肢體動作 * 似乎缺少了approach的部分而直接開始進行coding,建議先說明想法,和interviewer討論想法,覺得沒問題可寫code之後再寫code會比較有討論性。 * 似乎也缺乏test的部分,寫完程式碼的時候應說明test。 ## 第二次作業 - 他評02 ### 關於 interviewer ### 優點 * 有將題目的敘述寫出來很好,傳達題目更加清晰。 ### 可以改進的地方 * 可以在包裝或是改動一下題目,two sum題名也可以不用寫,否則容易便宜到刷題者。 * 聲音過小,在面試上會導致溝通不良。 ### 關於 interviewee ### 優點 * 在撰寫的當下有配合說明,非常棒 ### 可以改進的地方 * 回頭說明的時候建議以反白、選取的方式使人更加清楚在說明什麼部分。 * 可以更加具體的說為什麼改進了時間複雜度,比如資料從傳遞幾次降為幾次。 * 有想法之後建議化為註解,幫助自己掌握好接下來要實作的架構,也便於讓面試主持人知道。 * 最後沒有測試。reacTo