Try   HackMD

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

貢獻者: 努姓堅強-DogWangWang
模擬面試錄影: 1, 2, 3

🐼:interviewer
🐶:interviewee

測驗說明與問答

136. Single Number

🐼:同學你好,我們今天有一個題目,我希望你能幫我把它完成,那第一題是Single Number,我會給你一個list,那這個list裡有兩兩相對的整數,但其中會有一個單獨存在的整數,那我希望你能幫我把這個單獨存在的整數找出來
🐶:所以我以一個例子來舉例,這個List應該是會長成[1, 2, 3, 4, 5, 4, 3, 2, 1],而其中4是單獨存在的整數
🐶:那我想我會先把這個list的長度先抓出來,然後去輪巡這個list,並把他加入一個新的list裡,並去常看這個list的長度,當list的長度只有1時,代表這個值就是單獨存在的整數

def singleNumber(self, nums):

    length = len(nums)

    for n in range(length):
        number = nums[n]
        repeat = []
        for i, val in enumerate(nums):
            if val == number:
                repeat.append(i)
        if len(repeat) == 1:
            return number

🐼:好,我這裡有發現一個嚴重的問題,你用for歷遍了整個list,然後又再裡面包了一層for,當今天這個list裡有上萬,甚至更多的整數時,運算時間是否會花太長
🐼:我們換個思路,因為這個題目是在list中,除了一個整數只出現一次以外,其餘每個整數都出現兩次,所以你是不是有機會讓其倆倆互相抵銷呢
🐶:兩個互相抵銷,好,我想我有一點想法了,那我是不是可以用set讓這個list變成不包含重複元素的無序集合,並把這個不重複的list加總起來*2之後,減去原先的list那我就會得到單獨存在的整數了

def singleNumber(self, nums):

    single = sum(list(set(nums)))
    sol = (single * 2) - sum(nums)

    return sol

🐼:好,這位同學你這個方法也可以,但其實這個題目我們是想使用XOR來解決,XOR 的一個重要特性是:a XOR a = 0 和 a XOR 0 = a
這意味著如果你將所有數字進行 XOR 運算,出現兩次的數字會互相抵消變成 0,最後只會剩下那個出現一次的數字,那如果使用XOR來解決的話,你會怎麼處理
🐶:如果使用XOR來解決的話,我想我應該會這麼做

def singleNumber(self, nums):

    result = 0
    for num in nums:
        result ^= num

    return result

2032. Two Out of Three

🐼:OK, this is other question, Two out of Three, this question will give you three integer arrays nums1, nums2, nums3 and you need return at least two out of the three arrays. You may return the values in any order.
🐼:You can look example, nums1 = [1,1,3,2], nums2 = [2,3], nums3 = [3], [3,2] are present in at least two arrays
🐶:OK, I think I will use for to see nums1 values, if value is in nums2 or nums3, and I can make new list to append this value
🐶:Same as nums2, I can look if nums2 values is in nums3, I append it to list too, but this list may have repeat values, so I use set to that values to be only one

def sol(nums1, nums2, nums3):
    New_nums = []
    for i in nums1:
        if i in nums2 or i in nums3:
            New_nums.append(i)

    for i in nums2:
        if i in nums1 or i in nums3:
            New_nums.append(i)

    New_nums = list(set(New_nums))

    return New_nums

🐼:I think this question is very easy, but the code will be difficult to read if you write it like this, because you use too many same code in the answer, this is not friendly, so I want you can clean your code become more concise
🐶:OK, if I want clean my code, and I would change like this

def sol(nums1, nums2, nums3):
    set1, set2, set3 = set(nums1), set(nums2), set(nums3)
    
    result = (set1 & set2) | (set1 & set3) | (set2 & set3)
    
    return list(result)

46. Permutations

🐼:好,那我們來完成最後一個題目,這個題目我會給你一個list,這list裡可能會有許多整數,那我希望你用這個list裡的整數去做排列組合,並且把所有有可能的排列組合都列出來
🐶:那我們一開始的話用[1,2,3]去做一個範例,當[1,2,3]→[1,3,2]之後,我希望把[1,3,2]變回[1,2,3],接著再去做另一種排列組合[1,2,3]→[2,1,3]→[2,3,1]
🐶:那因為我們需要回朔成原本的狀態,且如果我們用len(nums)作範圍,nums[i], nums[i+1]做交換,最後的nums[i+1]就會造成溢出,所以必須再寫一個嵌套函數並初始化變數start=0,這樣才能達成我們的需求,並且nums[i], nums[i+1]交換完成儲存後,必須把nums[i], nums[i+1]再交換一次,以回到初始狀態

def permute(nums):
    def backtrack(start=0):
        if start == len(nums):
            result.append(nums[:])
        for i in range(start, len(nums)):
            nums[start], nums[i] = nums[i], nums[start]
            backtrack(start + 1)
            nums[start], nums[i] = nums[i], nums[start]

    result = []
    backtrack()
    return result

🐶:
所以當start= 0, i= 0, [1,2,3]將不動
並且backtrack(start + 1)
start=1 ,i 將有兩個可能性 1 or 2
start=1 ,i=2 時 [1,2,3]→[1,3,2]
並把[1,3,2]儲存起來

到了後面那一行的nums[start], nums[i] = nums[i], nums[start]
start=1, i=2, 會再把[1,3,2]交換回來, 回朔成原本list的樣子
[1,3,2]→[1,2,3]

檢討

程式部分

1.影片中語法格式直接打錯,宣告function時,明明是用python,卻多加了大括號
2.避免思考過程停頓過久
3.要確定把所有解法細節想仔細再開始動手寫,缺乏REACTO裡的R
4.沒有對時間複雜度和空間複雜度做討論

交談過程

1.等到interviewer確實了解你的方法,在開始進行coding
2.應該跟interviewer有更多的互動
3.英文口說極差需加強,會忽然想不到詞彙,然後就停頓了
4.不要有太多的不肯定句
5.少用助語詞


第二次作業-他評01:

針對interviewer

  • 優點
  • 語速剛好
  • 口齒清晰
  • 可改進的地方:
  • 0:03: 叫同學有點奇怪,可以改叫先生。
  • 0:05: 不要透漏有幾題比較好。

針對interviewee

  • 優點
  • 名字取得很棒。
  • 說明之處用滑鼠反黑。
  • 可改進的地方
  • 缺乏帶入實踐例子去test程式碼是否有誤。
  • 缺乏Repeat的部分,這樣如果遇到誤解題目的時候,後面寫Code的部分也會寫錯,會讓面試分數大打折扣。

第二次作業-他評02:

interviewer

  • 優點
  • 第一題漸進式的引導interviewee作答,以看出interviewee的思考方式,並且最後提出自己會使用的做法,讓interviewee實做出來我覺得這樣的方法不錯。
  • 可改進
  • 英文題目解釋的不是非常清楚

interviewee

  • 優點
  • 中文題目在coding時一邊解釋還算清楚
  • 第3題有一邊思考一邊作答的感覺,有臨場感
  • 可改進
  • 英文題目解釋的不是非常清楚
  • REACTO 中缺乏 R
  • 錄影: 可以錄到上半身,到胸口處,然後打碼打在臉上,這樣可以看到肢體動作

第二次作業-他評03

interviewer

  • 優點
  • 10:55: 給的指示明確
  • 可改進的地方
  • 6:11: 可以直接用時間複雜度
    O(N2)
    去分析比較直接,或是直接請面試者自行分析也可以
  • 1:01: 題目example已經快說完了就再撐一下把他講完吧,so…I think you can understand what I mean,這樣的說法感覺不夠正式。
  • 1:12: 與其說let's write down your answer不如給面試者機會說說他的approach
  • 10:37: REACTO的順序這樣的話,運作方法就變成在coding後面了,在coding前就先說好方法,coding後就進入測試了

interviewee

  • 優點:
  • 13:07: 利用滑鼠框出要說明的點清楚標示說明處,不會因遠端面試時傳輸延遲而造成不清楚
  • 可改進的地方
  • 9:50: 此處的解釋其實就是一個小的example,說明你要採取的approach,所以在實際coding前就可以先說了,也比較符合REACTO,A再C的過程,而非寫完再解釋用的方法。因為面試過程很有可能一開始想的方法的方向不對,等寫到一半interviewer才跟你說這樣不太行,前面時間就浪費了。
  • 10:43: 深藍的標記根黑字太像造成模糊,可用較淺的highlight
  • 12:26: 沉默16秒,這段時間可以說出自己當下再思考什麼?
  • 英文題目中缺乏時間空間複雜度的分析,以及沒有Test的部分
  • 5:53, 7:16: 寫程式中間一些幫助自己思考的話,因為是要讓面試者知道自己是怎麼想的,所以其實可以以對interviewer說話的方式去說,如果寫了一點說了一點,interviewer比較難去理解你的整體想法

第二次作業-他評03:

interviewer

  • 優點
  • 引導得很仔細!
  • 可改進
  • interviewer和interviewee的轉換不明顯,難以區分現在是誰在講話。
  • 建議可以包裝一下問題。

interviewee

  • 優點
  • 一邊coding一邊講解得還算清楚
  • 會適時的反白,讓interviewer知道現在在講哪裡
  • 可改進:
  • interviewer和interviewee的轉換不明顯,難以區分現在是誰在講話。
  • 音量可以大一點、一致一點

第二次作業-他評04:

  • 優點
  • 講解的算清楚。
  • 有適時反白讓人知道你講到哪了。
  • 可改進
  • 可以再大聲一點會比較好。