# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023)」作業 2
> 貢獻者: 貓貓-Haku
> 
> source - [Rachel & Jun](https://twitter.com/RachelAndJun/media)
> [模擬面試錄影(漢)](https://youtu.be/9iOsBNedu8s)
## [2605. Form Smallest Number From Two Digit Arrays](https://leetcode.com/problems/form-smallest-number-from-two-digit-arrays/)
### 面試過程
* 👨💼 是 interviewer
* 👨💻 是 interviewee
* 👨💼
你好我是負責本次面試的人員。
如果沒有什麼問題,我們就直接開始今天的面試吧。
* 👨💻
我沒有任何問題,隨時都能開始。
* 👨💼
那麼首先想請問您一個問題,給定兩個非空陣列 nums1, nums2,裡面含有unique digits,1~9,請你找出最小的數字,兩個陣列都需要至少一個digit出現在這個數字中。這裡有個例子
nums1 = [4,1,3], nums2 = [5,7]
答案是15,1出現在nums1,5出現在nums2,並且這是最小的數字。
* 👨💻
好的,所以我會有兩個非空陣列 nums1, nums2,然後要找出一個最小數字,那假設
nums1 = [1,2,3], nums2 = [2,3,4]
答案是2,因為2同時出現在兩個 array 中,並且這是最小的數字,這樣對嗎?
* 👨💼
對
* 👨💻
那我想法是,首先走過一遍兩個 array,紀錄出現的 digit,如果有 digit 同時出現,那就回傳最小的同時出現 digit ,如果沒有就回傳nums1最小 digit 結合 nums2 最小 digit的數字。那我開始寫程式碼。
```java
class Solution {
public int minNumber(int[] nums1, int[] nums2) {
int[] count=new int[10];
int min1=9,min2=9;
for(int i=0;i<nums1.length;i++){
min1=Math.min(min1,nums1[i]);
count[nums1[i]]++;
}
for(int i=0;i<nums2.length;i++){
min2=Math.min(min2,nums2[i]);
count[nums2[i]]++;
}
for(int i=1;i<10;i++){
if(count[i]>=2){
return i;
}
}
return min1>min2?min2*10+min1:min1*10+min2;
}
}
```
* 👨💻
時間複雜度是 O(n), n = max(nums1.length, nums2.length)
空間複雜度是 O(1), count digit 只會有1~9,不會隨n變大
我們以這個範例測試
nums1 = [4,1,3], nums2 = [5,7] ans = 15
[0,0,0,0,0,0,0,0,0,0], min1 = 9, min2 = 9
[0,0,0,0,1,0,0,0,0,0], min1 = 4, min2 = 9
[0,1,0,0,1,0,0,0,0,0], min1 = 1, min2 = 9
[0,1,0,1,1,0,0,0,0,0], min1 = 1, min2 = 9
[0,1,0,1,1,1,0,0,0,0], min1 = 1, min2 = 5
[0,1,0,1,1,1,0,1,0,0], min1 = 1, min2 = 5
* 👨💼
好的,你做得很好,那如果不保證 digit 是 unique 要怎麼改?
* 👨💻
```java
class Solution {
public int minNumber(int[] nums1, int[] nums2) {
boolean[] count1=new boolean[10];
boolean[] count2=new boolean[10];
int min1=9,min2=9;
for(int i=0;i<nums1.length;i++){
min1=Math.min(min1,nums1[i]);
count1[nums1[i]]=true;
}
for(int i=0;i<nums2.length;i++){
min2=Math.min(min2,nums2[i]);
count2[nums2[i]]=true;
}
for(int i=1;i<10;i++){
if(count1[i]&&count2[i]){
return i;
}
}
return min1>min2?min2*10+min1:min1*10+min2;
}
}
```
* 👨💼
好的,沒有問題,今天的面試到此結束?
## 他評
### [吳倚攝](https://hackmd.io/@sysprog/ryYse8pJp)
#### interviewer
- [ ] 優點
* 講話清楚
#### interviewee
- [ ] 優點
* 講解演算法清晰易懂
- [ ] 可改進部分
* 缺少REACTO中的repeat
* word有自動大寫的問題,可以換其他文書軟體
* 撰寫程式時可以多解釋程式內容
* [1:20](https://youtu.be/wJSxcNzuIig?t=80): 「用前面的元素把它蓋掉」應該是「用後面的元素把前面的蓋掉」
* [1:55](https://youtu.be/JW3YP17EPEY?t=114): character 發音不對
### [六六](https://hackmd.io/@sysprog/SJtyg_6yT)
#### Interviewer
- [ ] 優點
* 口齒清晰
#### Interviewee
- [ ] 優點
* 英文講得很好
* 打字速度很快,排版整齊
* 對問題的提問很全面
* 寫程式時會一邊寫一邊解釋程式,很棒
* 第一題 two pointer 講解很清楚,用 ^ 在 array 的下一行代表pointer是個好方法
* 第三題寫程式前先用註解寫大綱很清楚的表達了程式內容
### [朱舞花](https://hackmd.io/@sysprog/ByN0NI8kp)
#### Interviewer
- [ ] 可改進部分
* [18:09](https://youtu.be/q4tgMoBPUlU?t=1089): 提到 star graph 可以講解 star graph 的定義
#### Interviewee
- [ ] 優點
* 口齒清晰,音量合適
- [ ] 可改進部分
* [17:16](https://youtu.be/q4tgMoBPUlU?t=1036): 這邊有一段無聲的時間,檢查程式可以用舉例測試
* [00:52](https://youtu.be/QjGs9ktjIfw?t=52): 講解解法可以多花一點時間,不用直接開始寫程式,這之後有很長一段的暫停,看起來就像沒想好。
* [05:43](https://youtu.be/QjGs9ktjIfw?t=343): 沒解釋 pointer 怎麼在 array 中移動
* [05:54](https://youtu.be/QjGs9ktjIfw?t=354): 能更詳細解釋為何有重複就一定有cycle
### [克勞迪](https://hackmd.io/@sysprog/H1hglOTy6)
#### Interviewer
- [ ] 優點
* [08:09](https://youtu.be/N4eiA2HKRUc?t=489): 明確提到公司的需求
#### Interviewee
- [ ] 優點
* [08:46](https://youtu.be/N4eiA2HKRUc?t=526): 對於動態規劃的解釋非常清晰易懂
* REACTO 中的 repeat 做得很好
* 語速很快同時口齒清晰,可以很快的給出面試官要的資訊
- [ ] 可改進部分
* [04:14](https://youtu.be/N4eiA2HKRUc?t=254):打程式的過程可以講解一下,面試官不一定可以直接看懂
* [02:56](https://youtu.be/icIoCbfhwb8?t=176): 需要提供 TreeNode 的資料結構
### [迪奧](https://hackmd.io/Kk7HTlbNQj2jlCU93aspdA)
#### Interviewer
- [ ] 優點
* 英文講得很好
- [ ] 可改進部分
* 背景音樂會干擾聲音
#### Interviewee
- [ ] 優點
* 英文講得很好
* 第三題跟面試官討論的部分很好
- [ ] 可改進部分
* repeat 問題的時候可以把問題打出來
* 可以增加 REACTO 階段的 Testing
## 收穫
* 自己的英文口說要加強
* 不要有一段埋頭打程式的時間,可以說一點現在打的程式作用
* 打程式前可以多更面試官討論解法
* repeat 問題的時候把問題打出來
* 用 ^ 在 array 的下一行代表pointer是個好方法
---
## 第四次作業-他人評論-01
### Interviewer
- [ ] 優點
* 他是面試官
- [ ] 可改進的地方
* 整部影片的聲音都有點小聲
* 影片前半在講解題目的那邊互動偏少,只有講解題目
* 給題目的時候可以試著包裝題目而不是直接給題目,例如 : 公司會用陣列去儲存員工偷懶時數等等
### Interviewee
- [ ] 優點
* 大部分都有邊coding邊講解
* [12:10](https://youtu.be/9iOsBNedu8s?si=OroZdqnpGwopR4YU&t=730)這裡面試者有因應面試官的問題改出來,並且還有再優化(int改成bool)
* [3:55](https://youtu.be/9iOsBNedu8s?si=DYZ4e7tNLiDgT2vc&t=236)有點小murmur,但我覺得是好的,這個讓我感覺在快速檢查自己程式有沒有錯XD,順便讓自己想一下接下來的code
- [ ] 可改進的地方
* 整部影片的聲音都有點小聲
## 第四次作業-他人評論-02
- Interviewer:
- 優點:
- 面試官[此時](https://youtu.be/9iOsBNedu8s?t=29)說明題目,除了邏輯清楚、口齒清晰,也提供實際例子方便面試者理解題目的要求。
- 缺點:
- [此時](https://www.youtube.com/watch?v=9iOsBNedu8s)直接使用 LeetCode 原題([LC2605](https://leetcode.com/problems/form-smallest-number-from-two-digit-arrays/)),未做適度變形。例如,題目可以變為「公司尾牙舉辦抽獎活動,總共有兩個箱子,分別給男女員工投入自己的幸運號碼,最小的數字可以獲得特別獎…」。
- 我認為從影片的一開頭其實interviwer的聲音顯得比較有氣無力,不是很能聽清楚想要表達什麼。
- Interviewee:
- 優點:
- 面試者能夠迅速理解題目,並且想到一個「edge case」,[此時](https://youtu.be/9iOsBNedu8s?t=76)若有兩個陣列共享一個數字,其輸出結果可能會是個位數。
- 實作程式碼的過程中,[同時](https://youtu.be/9iOsBNedu8s?t=155)向面試官口頭敘述自己思考的點。除了方便面試官理解,也避免實作過程中枯燥乏味。
- 測試程式碼的過程中,面試者列出所有資料在不同時間點的演化過程,面試官[此時](https://youtu.be/9iOsBNedu8s?t=416)一目瞭然。
- 缺點:
- 確認題意及特殊例子後,面試者[此時](https://youtu.be/9iOsBNedu8s?t=142)最好等面試官給予意見反饋,始可開始實作程式。
- 面試者打錯字,[此時](https://youtu.be/9iOsBNedu8s?t=590)應該是 length 而非 lenght。
- 其他意見:
- 建議面試時使用 [CodeShare](https://codeshare.io/) 或其他 IDE 進行程式碼實作。
---