---
# System prepended metadata

title: 2023 年「資訊科技產業專案設計」作業 1

---

# 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