# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023)」作業 1 > 貢獻者: 肯尼-Ken > [錄影-1](https://www.youtube.com/watch?v=bIYaaTPyI30) > [錄影-2](https://www.youtube.com/watch?v=lBtk2yJKuP8) > [錄影-3](https://youtu.be/n6JoAZY2waA) > > :man::interviewer > :baby::interviewee ## [26. Remove Duplicates from Sorted Array](https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/) > [video](https://www.youtube.com/watch?v=bIYaaTPyI30) :man: 希望給一個排序過的array,可以把重複的element 從array中刪除 :baby: 先使用一個list儲存重複的element,在遞迴過程中,如果發現element不再重複的list中,就新增然後前進,如果存在則刪除此element ```python class Solution: def removeDuplicates(self, nums: List[int]) -> int: exist = [] p = 0 while (p< len(nums)): if nums[p] in exist: nums.remove(nums[p]) else: exist.append(nums[p]) p = p+1 return len(exist) ``` :man: 這樣太慢,須考慮到這是一個排序過的array,可以嘗試使用兩個指針,並且這次不用刪除,單純把沒有重複的元素擺在array前面即可 :baby: 我們可以使用兩個指針slow 和fast,用fast遞迴過程中,檢查element是否與slow指向相同,若相同fast前進;若不同則讓slow前進1格後改變其中的element,然後fast也前進。 ```python class Solution: def removeDuplicates(self, nums: List[int]) -> int: slow, fast = 0, 1 while fast in range(len(nums)): if nums[slow] == nums[fast]: fast += 1 else: nums[slow+1] = nums[fast] fast +=1 slow +=1 return slow+1 ``` ## [94. Binary Tree Inorder Traversal](https://leetcode.com/problems/binary-tree-inorder-traversal/description/) > [video](https://www.youtube.com/watch?v=lBtk2yJKuP8) :man: 給一個TreeNode的root,使用中序走訪將所有值取出 :baby: 中序走訪意味著我們需要檢查左邊沒有子節點後,再給出值,然後檢查右邊的子節點。我們用一個遞迴檢查左邊有無子節點後,將值加入list,然後再檢查右邊。 ```python class Solution: def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]: res = [] def midel_travel(node, res): try: if node.val == None: return except: return midel_travel(node.left, res) res.append(node.val) midel_travel(node.right, res) midel_travel(root, res) return res ``` ### [152. Maximum Product Subarray](https://leetcode.com/problems/maximum-product-subarray/description/) > [video](https://youtu.be/n6JoAZY2waA) :man: 給定一個array,請找出sub-array中有最大乘積的組合 :baby: 我會先試著完成,先計算所有sub-array可能性後再比較 ```python class Solution: def maxProduct(self, nums: List[int]) -> int: temp = [] leeee = 500 if len(nums) > leeee: limit = leeee else: limit=len(nums) for i in range(1,limit+1,1): for j in range(0,limit-i+1,1): val = nums[j] for k in range(1,i,1): # print(nums[j+k]) val*=nums[j+k] temp.append(val) try: return sorted(temp)[-1] except: return nums[0] ``` :man:這樣太慢,考慮看看只記錄最小最大 :baby: 我們可以從頭開始當作一個sub-array,只記錄到第n個最小和最大值,因為第n+1可能是負的或正的,這樣乘完最小(/最大)就變最大(/最小),即可知道sub-array中最大的值 ```python class Solution: def maxProduct(self, nums: List[int]) -> int: cur_max, cur_min = 1, 1 res = nums[0] for n in nums: vals = (n, n* cur_max, n * cur_min) cur_max, cur_min = max(vals), min(vals) res = max(res, cur_max) return res ``` --- ## 第二次作業-他評01 ### interviewer - [ ] 優點 * 題目解釋清楚 * 有開場自我介紹 - [ ] 可改進 * 樹走訪有很多種,而且方法很多,可以多問一些問題,q2就比較可惜了,有點草率結束 * 因為題目都直接在leetcode上展示,難以轉換題目 ### interviewee - [ ] 優點 * R E A C T O 都有做到 * coding時解釋程式清楚 - [ ] 可改進 * 可以寫出例子或畫出圖來代替用手勢 (例如tree 走訪那邊,因為是前鏡頭,所以左右會顛倒,這樣解釋起來就會非常奇怪) * 可以分析時間和空間複雜度 * 沒有自評 * 不應該直接在leetcode上做模擬面試,正常面試不會有整合開發環境給interviewee測試程式正不正確,而是會和interviewer來回互動,如q3這題來回確認程式是否能run就有點奇怪了 * 不小心把名字露出來了 * q1 中間有一段沒有聲音了 ## 第二次作業-他評02 ### interviewer - [ ] 優點 * [7:40](https://youtu.be/n6JoAZY2waA?t=7m40s): 如果interviewee一直卡在syntext error,interviewer直接說 "Let's just forget errors." 能夠快速推動面試的進行 - [ ] 可改進 * 念題目的時候如果是照念的情況下,可以用鼠標直接指著題目的文字內容會更清楚。 * [5:24](https://youtu.be/bIYaaTPyI30?t=5m24s): 改進的方法建議給interviewee自己去思考。如果要變更題目可以打下來直接照唸會讓interviewee有忘記的可能。 * 建議角色可以標示清楚interviewer 與 interviewee的名稱。 * [10:08](https://youtu.be/bIYaaTPyI30?t=10m08s): 可以問一下這裡的複雜度為怎樣,不要直接透過leetcode平台判斷一個程式的複雜度,順便考驗一下interviewee是否只是背一個更優解,而不知道真正快在哪裡。 * [7:45](https://youtu.be/n6JoAZY2waA?t=7m45s): interviewer 直接講 "It runs too solw.",過於武斷,畢竟先前也沒有跑出程式碼,interviewee也未對自身的程式進行複雜度的計算過。是沒有依據的言論。 * [7:58](https://youtu.be/n6JoAZY2waA?t=7m58s): interviewer 盡量不要給出解法的提供以及依據。如果給出的用意是希望interviewee往那方向思考應該更委婉地說,讓interviewee有能力自己思考。 ### interviewee - [ ] 優點 * 英文表達流暢自然,如果是實體面試face to face,手勢有加強到互動的感覺 * 展現能夠不緊張的debug,排解問題的能力其實也很好。(如果一直debug最後能夠補充剛剛犯了哪些錯誤可能會比較好,也就是修正原先的Approach) - [ ] 可改進 * 因為是視訊手部動作沒甚麼感覺。 * 字幕很多打錯字 * [2:04](https://youtu.be/bIYaaTPyI30?t=2m04s): 問完 "Am I correct?" 可以等面試官回覆過後再繼續講下去,不知道是沒剪輯好,還是原先就沒有。 * [2:23](https://youtu.be/bIYaaTPyI30?t=2m23s): 再用手勢補充表達之前可以先把步驟打下來,或是有哪些資料結構,因為之後繼續講,面試官高機率會忘記先前你用那些變數存甚麼東西與用處,且其資料結構的意義。 * [5:20](https://youtu.be/bIYaaTPyI30?t=5m20s): 驗證的過程應該要用其他方法像是用範例跑過一次程式碼確認邏輯性,直接按submit有點危險,可能會有沒想到的情況出現。 * [7:42](https://youtu.be/bIYaaTPyI30?t=7m42s): 這個有點爆炸的手勢可以不用。 * [0:34](https://www.youtube.com/watch?v=lBtk2yJKuP8?t=0m34s): 可以避免講 "That's all"。可能有些人會覺得不太有禮貌。 * [0:47](https://www.youtube.com/watch?v=lBtk2yJKuP8?t=0m47s): REACTO沒有example.直接開始講方法了。 * [4:42](https://youtu.be/n6JoAZY2waA?t=4m42s) : 盡量不要依賴整合開發環境去debug一些語意的錯誤,因為這樣會讓interviewer覺得interviewee沒有自己debug的能力。 * [5:43](https://www.youtube.com/watch?v=n6JoAZY2waA?t=5m43s) : 錯一個語意錯誤不要一找到一個錯誤,就直接按submit遞交答案,因為這樣反反覆覆的錯syntex error會讓人interviewee本身自己很緊張。interviewer會對interviewee有粗心的不好印象。 ## 第二次作業-他評03 ### interviewer - [ ] 優點 * 針對面試者的問題有適時給出feedback - [ ] 可改進的地方 * 講出暴力解太慢之前,應該請面試者去分析一下複雜度,畢竟第一道解法通常都是最直覺的暴力解,也可以去了解面試者對演算法分析的理解度 ### interviewee - [ ] 優點 * 有上字幕而且英文講解非常的清楚,整體的解題思路還算清楚 - [ ] 可改進的地方 * [6:11](https://youtu.be/bIYaaTPyI30?t=371): 剪輯好像有點失誤,都沒有聲音 * 解釋很清楚,但實作上應該不需要try ... except .. 因為不太可能會有error或無法預期之狀況出現 * 資料結構術語去說明,比如DP解法,這樣聽者如果是有相關背景知識就會很容易跟上解題思路 ## 第二次作業-他評04: ### interviewer - [ ] 可改進的地方 * 如果直接告訴面試者要寫出inorder traversal的code,沒有將題目經過包裝(使用情境),或許可以請面試者解釋什麼是inorder traversal,這樣接到[00:37](https://youtu.be/lBtk2yJKuP8?t=37)的說明可能比較通順且像在互動 ### interviewee - [ ] 優點 * 有做到同時coding和講解 - [ ] 可改進的地方 * coding完之後缺少optimize及延伸問題