---
# System prepended metadata

title: 作業二筆記

---

# 作業二筆記
+ 作者基本資料
  - 中文暱稱 : 柯基
  - 英文暱稱 : Corgi 

## ==對其他同學的建議==

>第一位同學：靈魂程式手-Soul Coder: [連結](https://hackmd.io/@sysprog/BkGjhBpy6)
### interviewer
- [ ] 優點
* 設計題目的時候很簡潔有力，只有非常少的文字量但卻能夠讓面試者完全理解題意。

- [ ] 可改進的地方
* 與面試者的互動較少，如果可以的話應該在面試者寫code時多多與她互動。

### interviewee
- [ ] 優點
* 能夠很好的理解題意，以及直覺地就想到做法，並且能夠邊寫邊說明自己的實作細節。

- [ ] 可改進的地方
* 如果可以的話能夠說明一下自己為何要使用這些方法，並且實際的舉例，這樣有較高的互動性。

>第二位同學：夾克-jacket: [連結](https://hackmd.io/@sysprog/Hyqa3H6y6)
### interviewer
- [ ] 優點
* 能夠非常明確清楚的說明題目，而且還能夠舉例給interviwee聽，過程聽起來非常的順滑且清楚，interviewee甚至能夠在聽題目的過程中就開始想要怎麼解。

- [ ] 可改進的地方
* 如果能夠在interviewee說明自己的想法的時候適時的提供反饋，說不定能激發他產生其他種解法。

### interviewee
- [ ] 優點
* 不著急於建構程式碼，而是一樣先舉例並且聽取interviwer反應後再開始撰寫。

- [ ] 可改進的地方
* 可以試著分析自己的程式碼的複雜度，這樣大概能想到下一個優化的算法大概是多少複雜度。

>第三位同學：失去倪-RBIN: [連結](https://hackmd.io/@sysprog/rJ8AJupka)
### interviewer
- [ ] 優點
* 題目非常的簡短且簡單明瞭，也能夠把題目英文單詞轉換成中文，這樣interviewee如果對於中文的熟悉度更高的話有機會一聽到關鍵字就建構程式碼。

- [ ] 可改進的地方
* 第一題的題目在設計上比較缺乏可優化的屬性，如果可以的話應該要設計一些解可能有很多種，但是各種解之間可能具有可優化的關聯性的題目。

### interviewee
- [ ] 優點
* 可以在不了解題目清楚意涵的時候就提出問題，以幫助面試順利進行，如此一來可以幫助後續的面試過程更順利，只要專注於程式碼的優化以及撰寫就好。

- [ ] 可改進的地方
* 比較缺乏驗證的步驟，如果可以用簡單的例子順過一次各個解法，這樣對於兩種解之間的差異可能會有夠深刻的體會。

>第四位同學：半條悟-satoru: [連結](https://hackmd.io/@sysprog/HyktWdpyT)
### interviewer
- [ ] 優點
* 不應該提供具有 auto complete 的 IDE，透過無到有的建構過程也容易看出interviewee對於該語言的熟悉程度。

- [ ] 可改進的地方
* 英文題在講解的時候沒有任何畫面以及文字，只是單純地一直用口說，過程如果沒有中斷一下並詢問interviewee的狀況的話很容易說完之後還是要重新講解一次。

### interviewee
- [ ] 優點
* 每次寫題目的時候都有一個測試資料顯示在IDE上，並且在建構程式碼的過程中也能夠將滑鼠移動到測試資料上中途講解一下，很容易幫助理解演算法的邏輯。

- [ ] 可改進的地方
* 寫code的時候要注意排版，不應該有些operand跟operator中間有間隔，但有一些沒有，看了有點強迫症發作。

>第五位同學：月前龍馬-lonmu: [連結](https://hackmd.io/@sysprog/SkzGyUayT)
### interviewer
- [ ] 優點
* 題目敘述得相當清楚而且也直接把constraint加進去，這樣可以省去很多跟測資有關的疑問發生。

- [ ] 可改進的地方
* 應該避免直接複製leetcode的題目包裝一下，這樣有可能interviewee已經看到題目就在想解，根本沒在聽。

### interviewee
- [ ] 優點
* 完全有按照REACTO的步驟來演出自己的程式功力，也能夠分析自己的複雜度。

- [ ] 可改進的地方
* 在建構程式碼的過程中途有時候都沒講話有點小尷尬，如果能夠一邊講解自己的code的話可以讓互動性更高一點。

## ==我從同學的作業學到了什麼==
- 第一點，如果能夠完全依照 **REACTO** 的步驟來講解的話，最先能夠滿足的就是技術力的展示，這一點對於 technical interview 來說非常重要，能夠讓 interviewer 很好的了解到你這個人對於基本演算法的理解程度到哪裡，但是重要的肯定也不只這一點。
- 第二點，對於老師上課提過的 interview 是一場**表演**來說，看完大家的作業之後我有更深刻的體會，如果能夠很好的彼此一問一答，甚至是對於不理解的地方提出疑問，讓另一方來講解的話，這之中不會顯露出不理解的那方的愚笨，反而能夠讓彼此知道之後如果有機會合作的話，工作上跟同事交流的時候他大概會依照什麼方式來跟你進行溝通，所以互動性也是interview的一大重點。
- 第三點，則跟第一點有點重疊，**REACTO** 的 **O** 是非常重要的一個環節，這其中能夠測驗的是 interviewee 在遇到問題的時候可能會怎麼解決，而 interviewer 扮演的則是，在合作過程中，團隊成員如果發現了一些可以改進效能的線索，將這個部分在面試的過程中轉換為提示代表相同專案階段的時候，interviewee 是否能夠幫助團隊往更好的方向前進，所以我認為這也是很重要的一個點。

## ==作業二影片題目原型 Leetcode #41 First Missing Positive==
> 影片連結: [連結](https://youtu.be/lADCOOyH3Q8)
> 題目連結: [#41 ](https://leetcode.com/problems/first-missing-positive/)
> 解題語言: C++
> 說話語言: 漢語

**測驗說明以及問答**
  + 這一題原型是 leetcode hard 的題目， interviewer 藉由生活化的例子舉例讓 interviewee 去想像能夠怎麼解，而我也能夠藉由 **REATCO** 步驟一步一步的講解一開始的想法，以及接下來的 follow up。
    1. Space complexity $O(N)$ : 暴力解，把所有的資產額都看過一次，看一下是否已經存在。
    2. Space complexity $O(1)$ : 就地標記法，把 index 當作所有可能金額的標記，最後再歷遍看最小值是多少。

**最終程式解**
```C++=
class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        for(auto &temp:nums)temp = temp <= 0 ? nums.size() + 1 : temp;
        int temp;
        for(int i = 0 ; i < nums.size() ; i++){
            temp = nums[i] < 0 ? nums[i] * -1 : nums[i];
            if(temp <= nums.size() && temp >= 1){
                if(nums[temp - 1] > 0)nums[temp - 1] *= -1;
            }
        }
        for(int i = 0 ; i < nums.size() ; i++)
            if(nums[i] > 0)return i + 1;
        return nums.size() + 1;
    }
};
/*
    inplace recording
    (1) 1 <= ans <= nums.size()
*/
```
**自評**
+ interviewer 能夠避免使用 leetcode 原型題目，避免背題目的人一下子就開始想腦中的答案，也能夠藉由非常生活化的例子來讓 interviewee 有親切的感覺，更加深刻的體驗生活經驗。
+ interviewee 可以完美的應用 **REACTO** 的每個步驟，並且用實際的測試資料驗證自己的想法，更能夠想出進一步的優化算法達成更好的效率。
+ 新冠肺炎後遺症所以中途咳嗽聲不少，非常抱歉。
