# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023)」作業 2 > 貢獻者: 貓貓-Haku > ![](https://hackmd.io/_uploads/S1HnEZLJa.jpg =50%x) > 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 進行程式碼實作。 ---