---
# System prepended metadata

title: '2022 年 <a href = ''https://hackmd.io/@sysprog/info2022/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FBJLSJ3ggi''>「資訊科技產業專案設計」</a>作業二'
tags: [info2022-homework2]

---

###### tags: `info2022-homework2`
# 2022 年 <a href = 'https://hackmd.io/@sysprog/info2022/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FBJLSJ3ggi'>「資訊科技產業專案設計」</a>作業二

# 啊啊啊-AAA Homework1 (漢)
## [283. Move Zeroes](https://leetcode.com/problems/move-zeroes/)
### Interviewer優/缺點
- [0:00](https://www.youtube.com/watch?v=OpluD2vgj1w) 首先，可以稍微介紹一下自己，不用這麼急著就開始，可以稍微介紹一下為甚麼要選擇這個題目，還有為甚麼這個題目重要。
    另外就是，盡量不要把題目直接放在螢幕上，這樣如果給已經寫過這個題目的人來說，無疑是直接抄答案即可，也許Interviewer可以給圖片，或是其他可以幫助了解題目的東西。
- [0:10](https://www.youtube.com/watch?v=OpluD2vgj1w) Input 最後一個t 必須要發音
- [0:36](https://www.youtube.com/watch?v=OpluD2vgj1w) 在提出說明的時候，可以適時在document上面寫上自己剛剛舉的例子
- [0:46](https://www.youtube.com/watch?v=OpluD2vgj1w) 10的4次方可以改成說10000<一萬>就好。
- [1:00](https://www.youtube.com/watch?v=OpluD2vgj1w) 在討論到不能額外開出空間的時後，可以藉由專有名詞「in place」來帶入



### Interviewee優/缺點
- [1:39](https://www.youtube.com/watch?v=OpluD2vgj1w) 這邊有把例子寫出來，但先前的舉例我覺得應該是要給interviewer出才對。
- [2:04](https://www.youtube.com/watch?v=OpluD2vgj1w) 可以適度跟interviewer 提出In-place 的想法
- [09:55](https://www.youtube.com/watch?v=OpluD2vgj1w) 傳參照進來，好像沒有這種講法，應該要的講法為：傳位址進來
- [10:30](https://www.youtube.com/watch?v=OpluD2vgj1w) 在給予時間複雜度時，可以適度講一下是哪邊造就了這個時間複雜度，並且可以把時間複雜度一併打在程式碼附近
* [10:37](https://youtu.be/OpluD2vgj1w&t=719s) : 可提到為甚麼要move zeros 進而去討論他的時間複雜度以及空間複雜度。
## [120. Triangle](https://leetcode.com/problems/triangle/) 
### Interviewer優/缺點
- [12:32](https://www.youtube.com/watch?v=OpluD2vgj1w) 可以解釋一下，到底為何需要尋找三角形的最佳路徑
- [17:00](https://www.youtube.com/watch?v=OpluD2vgj1w) 這邊直接講，把演算法做成程式的時候，我覺得interviewer可以稍微和面試者討論一下此做法的優缺點，而不是講直接請他做出來。
- 

### Interviewee優/缺點
- [13:19](https://www.youtube.com/watch?v=OpluD2vgj1w) DP 又稱 Dynamic Programming 不要念成DB 不然這樣聽起來像是分貝 (db)
# 甘應化-Liver Homework1 (漢)
## [1. Two Sum](https://leetcode.com/problems/two-sum/)
### Interviewee 優/缺點
- [0:10](https://www.youtube.com/watch?v=aYB9eOhpXgY) 建議不要直接把原本的題目秀出來，試試看用自己的話講出來，就跟老師說的一樣，有時候秀出題目，沒有任何思考，會導致有一些人直接背答案。
- [4:47](https://www.youtube.com/watch?v=aYB9eOhpXgY) 在解釋時間複雜度的時候，可以在螢幕上面打字，告訴你的interviewer你的時間複雜度是多少。
- [5:22](https://www.youtube.com/watch?v=aYB9eOhpXgY) 同理，在解釋雜湊表的時候，如果沒有圖片解釋，或是例子直接打在上面的話，很難表達出到底要讓interviewer知道甚麼
- [6:00](https://www.youtube.com/watch?v=aYB9eOhpXgY) 一個大問題，把寫好的code移動至下方，如此一來，萬一面試官需要看你之前的works的話，不至於手忙腳亂，另外就是，不要刪掉已經寫好的東西。最後就是，可以在已經寫好部份code的狀況，直接把重點寫出來即可。
### Interviewer 優缺點
- [1:27](https://www.youtube.com/watch?v=aYB9eOhpXgY) 不要一直用滑鼠，可以試試看利用其他方法，比如使用小畫家的方式，可以更進一步的回答問題
# 亞拉岡-Aragorn Homework1 (漢)
## [136. Single Number](https://leetcode.com/problems/single-number/)
### Interviewee 優/缺點
- [00:00](https://www.youtube.com/watch?v=WMcbasFaqVo) 首先，不要用面試[官]，這樣有點給下馬威的感覺
- [03:33](https://www.youtube.com/watch?v=WMcbasFaqVo) 這邊做得非常清楚，美中不足的只有利用滑鼠表達會比較差而已，此時你已經有打出很多相對應的map了，為何不用鍵盤即可
- [08:50](https://www.youtube.com/watch?v=WMcbasFaqVo) 在解釋為甚麼要宣告整數時，打出的卻是迴圈，有點美中不足


### Interviewer 優/缺點
## [11. Container With Most Water](https://leetcode.com/problems/container-with-most-water/)
### Interviewer 優/缺點
- [11:07](https://www.youtube.com/watch?v=WMcbasFaqVo) 10的五次方可以直接講十萬就好，這樣以文字上來講比較清晰

### Interviewee 優/缺點
- [13:27](https://www.youtube.com/watch?v=WMcbasFaqVo) 這邊解釋的非常不清楚，應該可以在文字上面顯示，而不是直接用比手畫腳的方式演給interviewee

# 肉古察-Low Good Homework 1 
## 567. Permutation in String
### Interviewer 優/缺點
- [00:30](https://www.youtube.com/watch?v=ufz_Y_RoG1o) 首先，在介紹問題時，可以適時使用圖片或是自己手打example，否則面試者有時候因為完全沒有圖片支援，容易導致在這個區塊的時候就造成很多問題
- [03:26](https://www.youtube.com/watch?v=ufz_Y_RoG1o)interviewer 不應該要講出，這個題目我沒有想過這樣解，這樣對面試者來說，假設面試者很明顯知道這題的正解，那在面試結束之後只會顯得這間公司的interviewer對於這個題目的不熟悉，進而直接不選擇這間公司
### Interviewee 優/缺點
- [00:50](https://www.youtube.com/watch?v=ufz_Y_RoG1o) 在此時不知道為甚麼面試者有完整的題目，interviewer並沒有提起的，這樣有點讓人覺得好像要準備抄答案，而且題目一看就知道是leetcode上面搬下來的，這邊可能需要自己更改
- [04:15](https://www.youtube.com/watch?v=ufz_Y_RoG1o) 因為interviewer 剛剛講了不知道可以用bitwise 解題目，這樣有點導致立場對調。
- [07:50](https://www.youtube.com/watch?v=ufz_Y_RoG1o) 這邊只有講：counting sort 不是利用比較的方法排序，但我覺得這邊應該可以說：「counting sort 是一種利用list中數值特性去衍生的演算法，＜這邊講一下這題資料的特性＞，而這演算法可以在線性時間達成」 然後才接著說你可以怎麼實作演算法。 

## 997. Find the Town Judge 
### Interviewer 優/缺點
- [10:50](https://www.youtube.com/watch?v=ufz_Y_RoG1o) 你的面試都有一個特點，就是等到後面interviewee出現之後才會把題目放在上面，而不是從一開始interviewer就在上面打
### Interviewee 優/缺點
- [17:05](https://www.youtube.com/watch?v=ufz_Y_RoG1o) 在驗證程式碼的正確性的時候，需要打出例子，以及真實的數字，然後不要用滑鼠晃來晃去
## 136. Single Number (英文)

### Interviewer 優/缺點
### Interviewee 優/缺點
- [17:50](https://www.youtube.com/watch?v=ufz_Y_RoG1o) Language Filler 太多，導致我在聽的時候一直聽到 痾 痾 痾， 這對於英文面試來說是非常致命的


# 畝畸陡-Ivan Homework1 (漢&英)
## [Longest Common Prefix](https://leetcode.com/problems/longest-common-prefix/)
### Interviewer 優/缺點
- [0:00](https://www.youtube.com/watch?v=dEeR9h8-XEw) 不要用單聲道，很不舒服
- [0:00](https://www.youtube.com/watch?v=dEeR9h8-XEw) 老問題了，不要講自己是面試官
- [2:10](https://www.youtube.com/watch?v=dEeR9h8-XEw) Interviewer可以提出更多關於constrain 的要求，比如字串大小會多大，但是interviewee也沒有問，所以這邊是一個大敗筆
- 



### Interviewee 優/缺點
- [1:19](https://www.youtube.com/watch?v=dEeR9h8-XEw) input 看起來明明像是一個list，其中有可能有不同長度的字串也有不同長度的list，Interviewee竟然沒有先詢問是不是只有像螢幕上一樣只有三個input，這點有非常大的瑕疵
- [2:56](https://www.youtube.com/watch?v=dEeR9h8-XEw) 下面一直有東西在跑來跑去，有點傷眼睛
- [8:36](https://www.youtube.com/watch?v=dEeR9h8-XEw) 明明time complexity 都已經打出來了，為甚麼不把space complexity 也一併打出來呢?
- [13:42](https://www.youtube.com/watch?v=dEeR9h8-XEw) 剪接好像出了一點問題，這邊interviewee 重複講了structure 兩次
- [18:21](https://www.youtube.com/watch?v=dEeR9h8-XEw) 明明前面正確的講出了 null 的音，為何這時候又變成了台灣的版本呢?
- [20:51](https://www.youtube.com/watch?v=dEeR9h8-XEw) 剪接又出問題了，這邊又重複了一次，我還以為我中了伊邪那美
- 

## [Longest Mountain in Array](https://leetcode.com/problems/longest-mountain-in-array/)
### Interviewer 優/缺點



### Interviewee 優/缺點

- [26:23](https://www.youtube.com/watch?v=dEeR9h8-XEw) 這也是經典的sliding window 或是DP 的演算法，如果打從一開始就知道這個演算法，可以直接跟interviewer 講，跟他溝通為甚麼要這樣做，如此一來這題目就沒有一定要寫出來的必要了。再加上，在描述你的做法的時候並沒有提到approach是甚麼
- 
# 評論心得以及學習心得：
==在評論別人時，總是可以看到自己哪裡做不好，以及別人正在做一件事情時，自己是不是也做了同樣的事情... 諸如此類的縮影。對於我來說，我覺得評論別人比自己錄影學到更多東西，尤其是在錄影的時候，自己先把講稿都大概想好，想要講甚麼事情都想好，但總是會缺乏了一些自己想要的東西。在看亞拉岡-Aragorn Homework1的時候，我看到了他對於面試的理解，不需要把整個code打出來也可以讓別人知道你對於code的理解程度很高。最重要的一點就是，利用鍵盤以及圖像的方法讓雙方都徹底理解想要做的事情是甚麼。==
==這次也讓我徹底理解面試的用意是甚麼，我覺得不是為了要讓別人知道你會打code，因為基本上大部分人都會，所以重點也在於你在面試時如何藉由慢慢地思考以及互相引導，去營造出最完美的面試氛圍，如此一來，雙方都可以知道彼此是值得信賴的人。==


# 自我錄影 ＜全新＞
## [136. Single Number](https://leetcode.com/problems/single-number/)

:8ball: interviewer , :baguette_bread: interviewee, :a: Narriator
	對話：
:a:	來到我的面試，今天的面試設定在<藍寶> 要去面試一個伺服器工程師，廢話不多說，接下來就開始吧
:8ball:	"哈囉，今天會是我來主持這場面試，讓我們公司同仁來了解一下你在程式開發上的想法以及風格吧！
我想你應該有對我們的職缺稍微了解一下吧，在我們公司需要對硬碟架構以及分割非常熟悉，接下來的題目也會跟此有關連"
:baguette_bread:	你好，我會嘗試全力以赴的。
:8ball:	好的，那我開始解釋今天的題目，今天我想要讓你找出一個陣列中重複的數字
:baguette_bread:	想要請教一下，找出重複的數字是甚麼意思呢?
:8ball:	"我將會給定一個整數型態的陣列，而這個串列除了一個特定的數字只有出現一次之外，其他的數字都會剛剛好出現兩次
，而你的工作就是回傳那個陣列中沒有重複的那個數字"
:baguette_bread:	想要請問這個題目的陣列大小以及數字的範圍
:8ball:	陣列的大小會從一個元素到三萬個元素不等，而數字的值也會在正負三萬內
:baguette_bread:	好的，也就是說，當我看見了 [2] 的陣列，我只需要回傳 2 這個整數就好嗎?
:8ball:	沒有錯
:baguette_bread:	所以假設輸入為：[1,2,2,4,1,4,3] 我要回傳在這個陣列中沒有重複過的數值，也就是3對嗎?
:8ball:	沒有錯
:baguette_bread:	我想要請問一下，有沒有可能數字出現三次以上或是沒有單一的數字呢?另外想要請問可不可以更改陣列裡面的數值呢?
:8ball:	沒有這個機會，輸入一定會是和以上的格式一樣，然後你不可以更改陣列中的數值
:baguette_bread:	"好的，那我開始介紹我的想法：
```
           首先，我覺得可以建立一個雜湊表，先跑一個for 迴圈
                       1 2 2 4 1 4 3
                             ^
           建立出像是下面的表格
                   1 | 2
                   2 | 2
                   4 | 2
                   3 | 1
```
:baguette_bread:	接下來只需要重新跑過一次剛剛建立好的雜湊表，這樣就可以得到哪個數字只出現了一次，然後回傳那個數字即可
:8ball:	那你可以告訴我一下這個程式的時間複雜度以及空間複雜度嗎?能給出的數字越精準越好。
:baguette_bread:	"好的，這個程式的時間複雜度為O( n + 0.5 * n) = O(n) 因為會剛剛好跑過陣列一次，緊接著繼續跑過一個最大為 floog(0.5 * n ) + 1 大小的陣列
最後才會把需要的值還給我們
而這個程式的空間複雜度也因為有一新增一個0.5 * n 大小的陣列，所以空間複雜度為Θ(0.5 * n) "
:8ball:	沒有問題，但是你這個程式不僅是空間還是時間都不是很好，我想要請問你有沒有更好的方法
:baguette_bread:	我想，如果要降低空間複雜度的話，其實可以試試看把這個陣列先做排序，然後每次找兩個數字，如果前後不一樣的話就回傳第一個數字
:8ball:	那你可以多講解一下你這個方法嗎?另外再跟我說說看他的時間複雜度以及空間複雜度
:baguette_bread:	"好的，那假設用排序演算法，把剛剛的陣列 [1,2,2,4,1,4,3] 做排序，如此一來，陣列就會變成 [1,1,2,2,3,4,4]
接下來我們可以每次推進兩格，看看 a[i] 跟 a[i+1] 的元素是否相同，如果不一樣的話就直接回傳a[i]
那這個方法的時間複雜度因為被排序演算法的時間綁住，所以最快也只能到O(nlogn)的速度，雖然空間複雜度被降低了，但也因此而變慢許多"
:8ball:	你說的沒有錯，這程式還是有些許問題存在，其中最大的問題就是時間被拉大了。
:baguette_bread:	"沒有錯，這個程式有很多問題，而我覺得這個題目的精隨就在於如何利用整數儲存的方法去進行xor比較，其中在
RAID-5 中，Parity disk 的設計就是利用xor 在數學上的特性來建構的"
:8ball:	沒有錯，Xor的數學特性非常好，請問他具體上有那裡可以使用在這題目上呢?
:baguette_bread:	"XOR 他具有交換律以及結合律跟分配律，另外就是 0 和 a 進行xor的話，結果會是a，而a 和 a 進行xor 會得到0
也就是說，以這個題目的假設，所有的數字都出現剛剛好兩次，只有其中一個數字出現了一次
那假設這個陣列叫做a
其中我要找到 那個特定的數字，假設叫c"
:baguette_bread:	"我們令 a 為 [a1, a2,a3,c,a5]
給定公式為 :
	==f = a1 ⊕ a2 ⊕ a3 ⊕ c ⊕ a5==
而我們繼續假設 a1 = a2 且 a3 = a5， 那這個公式就可以利用交換律以及規一律把她重新寫成以下的公式
==(a1 ⊕ a2) ⊕ (a3 ⊕ a5) ⊕ c = 0 ⊕ 0 ⊕ c =  c== 
也就得到我們需要的結果"
:8ball:	利用xor的數學特性來解題非常好，那接下來能夠請你把程式實作出來嗎?
:baguette_bread:
```
int find(int* nums, int numsSize){
   int result = nums[0];
   for( int I = 1; I < numsSize; ++I){
            result  = result ^ nums[I];
}
return result;
}
```
:8ball:	非常好，想要請問你這個程式的時間複雜度以及空間複雜度各為多少，也是越精準越好
:baguette_bread:	那因為這個程式只會跑過一次這個陣列，所以這個程式的時間複雜度為Θ(n) 而空間複雜度也因為只有用到一個變數，所以為 Θ(1) 
### Follow up [137. Single Number II](https://leetcode.com/problems/single-number-ii/)
:8ball:	沒錯，這也是答案的正解，那你想想看，當這個陣列中重複的元素變成三個時，你有沒有辦法利用剛剛那些想法做出來呢？
:baguette_bread:	請問你的意思是指原本重複兩個，這次變成三個嗎?
:8ball:	沒有錯
:baguette_bread:	限制都不變嗎?
:8ball:	不，這次陣列中數值的上下限變成 2的補數表示法的所有數。
:baguette_bread:	"了解，讓我想一下。。。
我相信一開始提供的兩個解法，也就是雜湊表以及排序的方法都可以更改，這次好像不太是使用xor運算，我想要請問一下能不能夠給一點提示呢?"
:8ball:	好。你想想，2的補數表示法總共有幾個位元
:baguette_bread:	32個
:8ball:	也許你可以從這方面下手
:baguette_bread:	"好的，讓我思考看看
啊！ 假設給定一個陣列如下：[2,2,2,5,5,5,4]
每一個整數的位元表示法為
```
	2 --> 010
	2 --> 010
	2 --> 010
	5 --> 101
	5 --> 101
	5 --> 101
	4 --> 100
	      ^^^
	      433
```
我們可以從位元的第一個位置開始看，如果那個數字是1的話，就讓local 變數 sum + 1，如果他不是三的倍數的話，那就代表那一個
位元是要被留下來的，也就是說那一個位元可以在給定的新的數字中存在，在這個例子當中，因為b3 有4個1，代表新的數字中b3
需要被設定為1，只要跑到最後，就可以知道數字為多少了
"
:8ball:	那你可以試試看把你的想法實作出來嗎?
:baguette_bread:	"好的：

```
int singleNumber(int* nums, int numsSize){
     int ans = 0;
     for(int i=0;i<32;i++){
          int sum =0;
             for(int j=0;j<numsSize;j++){
                  if((nums[j] >> i) &1 == 1 ){
                       sum++;
                       sum %= 3;   
                    } 
              }
           if(sum != 0)
                   ans |= sum << i;
        }
    return ans;}
```
如此一來 這個程式的時間複雜度不管如何都會是 O(32 * n)"
:8ball:	"這看起來還不錯，如此一來就可以利用bitwise operation 的方式找到沒有重複的數字，不過我想要修正一下剛剛你講不需要用到xor的地方，
其實這一題還是可以用到xor的運算，也許你想要想想看?"
:baguette_bread:	好的我試試…
:8ball:	抱歉我們今天的時間已經差不多了，希望你可以回去想想看如何多利用一種方法解這個問題，納今天到此為止吧，再見。





