# 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