---
# System prepended metadata

title: '2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023)」作業 2:'

---

# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023)」作業 2:
> 貢獻者: 新鮮柿-Shizi
## **OVERVIEW 對他人的評論(大略):**
### 針對interviewer的評論:
#### 優點:
* 題目說明非常明瞭。
* 詢問是否能使用函式庫。
* 很好的面試開頭。
* 叫同學有點奇怪，可以改叫先生。
#### 可改進之處:
* 開頭嚴肅。
* 與interviewee的互動少。
* 題目稍微包裝一下會更好。
* 問題單純只問時間以及空間複雜度略顯單薄，可以在問題上多加一些包裝並結合後面提問改善方法的地方成為一個問題來問面試人。
### 針對interviewee的評論:
#### 優點:
* 講解仔細
* 說話流暢
* 說明之處用滑鼠反黑
#### 可改進之處:
* 缺REACTO步驟
* 如果邊打code邊解釋會更好
* 沒有時間複雜度或空間複雜度的探討
* 講話節奏有點奇怪，可以調整一下呼吸
* 有些人說話會笑，不過有時候笑的地方很奇怪可能會讓面試被扣分

### 針對程式:
* 提供TWO SUM C++ 用暴力解以及hashmap實作程式碼

## **經過HW1以及HW2他評後學習到了什麼?**
經由評論別人找尋其他人的缺點以及優點時，同時也是在檢視自己，什麼是別人做不好我也做不好的地方亦或是別人做的很好我卻沒做到之處。其中：
### 許多人沒做到（有人有做到）而我也沒做到的地方
1. 題目的包裝
2. 語助詞太多
3. 面試官對附加問題的包裝
4. 聲音太過平淡（說話沒有起伏）
5. 英文發音
6. 面試官在面試開始時，直接進入面試沒有鋪陳
7. 在approach說明得太過簡略
8. 不必要的肢體動作
### 自己覺得自己做的還不錯的地方
1. 均有符合REACTO
2. 程式講解仔細

## [26. Remove Duplicates from Sorted Array](https://leetcode.com/problems/remove-duplicates-from-sorted-array/)
[**影片連結**](https://youtu.be/L0pNVBA3epk)
>**題目有微調**
>👹: interviewer
>🤡: interviewee

👹:先生你好，從你的履歷能感受到你對程式設計的熱愛以及對本公司的工作任務有很多的想法，不過我還是希望先了解你的程式設計的想法以及風格，我這裡有一個問題希望你能提供我一些想法，問題是這樣的我們公司有一個有一個硬體維修通報系統，公司成員可以方便的按一下桌邊的按鈕送出他的座位有硬體故障需要維修，不過我們最近發現一些問題，往往會有一些比較心急的員工會連續按按鈕好幾下導致系統塞車，你會如何解決此問題?
#### **Repeat & Example & Approach1:**
🤡:連續按按鈕好幾下導致系統塞車的問題嗎?如果是我的話，我會將在故障通報的list中連續出現的的通報號碼刪除來緩解系統塞車的問題(因為如果是連續出現有很高的機率是一次點很多下)，我這裡舉一個例子假如一個故障通報的list為[1,1,2,2,3]的話，再把連續且重複出現的通報號碼刪除之後就會變成[1,2,3]，這樣就能解決系統塞車的問題了。
```
Example:

[1,1,2,2,3] ======>[1,2,3]
```

👹:聽起來是個很不錯的解決方法，那麼如果要你用程式設計來實現此功能你會怎麼做?
#### **Approach2:**
🤡:我會將故障通報的list以array的方式實現，然後使用快慢指標來實現此功能。

👹:OK!那你能嘗試用C語言且以in-place的方式把此功能撰寫出來嗎?

🤡:也就是說除了一些計數用的變數外，基本上都在原先的array內完成此功能對吧?

👹:是的!
#### **Code:**

🤡:好的!
```cpp
int removeDuplicates(int* nums, int numsSize){
    if (numsSize <= 1){
        return numsSize;
    }
    int count = 0;
    for(int i = 1; i < numsSize; i++){
        if(nums[i] == nums[i - 1]){
            count++;
        }
        else{
                nums[i - count] = nums[i];
            }
        
    }
    return numsSize - count;

}
```
🤡:這個方法時間複雜度為O(n)、空間複雜度為O(1)。

👹:好的，那你可以用一個例子驗證你得程式碼嗎?

🤡:ok!
#### **Test:**
```
EXAMPLE:
input [1,1,2,3,3] numsSize = 5

**Start Iterating** 
1. count = 0; i = 1;
    nums[1] == nums[0] => count+1
    
    array: [1,1,2,3,3]
    
2. count = 1; i = 2;
    num[2] != num[1] => nums[1] = nums[2]
    
    array: [1,2,2,3,3]
    
3. count = 1; i = 3;
    nums[3] != nums[2] => nums[2] = nums[3]
    
    array: [1,2,3,3,3]
    
4. count = 1; i = 4;
    nums[4] != nums[3] => count+1
    
    array: [1,2,3,3,3]
**End Iterating**
    
numsSize - count = 3  

result: array:[1,2,3] numsSize = 3
```

👹:看起來沒什麼問題，不過你這種刻意將array的size縮短的作法，可能會導致之後有其他員工按按鈕時，因為array空間已滿，而出現問題，你要如何改善此狀況?
#### **Optimization:**

🤡:我現在有幾個想法，第一種方法是可以在每次執行後有人按按鈕時就重新動態分配記憶體，不過這一種方式較費時，但是比較省空間。
```cpp
int *dynamicArray = (int *)malloc(numsSize * sizeof(int));//原本陣列大小

dynamicArray = (int *)realloc(dynamicArray, (numsSize + 1) * sizeof(int));//陣列大小+1
dynamicArray[numsSize] = newValue;//輸入新值 
```
第二種方法就是直接分配一個較大的空間給array，雖然比較占空間，但是這樣就不用浪費時間重新分配記憶體了，如果使用這種方法，我也程式碼就需要稍作修改。
```cpp
int removeDuplicates(int* nums, int numsSize){
    if (numsSize <= 1){
        return numsSize;
    }
    int count = 0;
    for(int i = 1; i < numsSize; i++){
        if(nums[i] == nums[i - 1]){
            count++;
        }
        else{
                nums[i - count] = nums[i];
            }
    }
    for(int i = 0; i < count ; i++){
        nums[numsSize - 1 - i] = 0;
    }
    return numsSize;
}
```
👹:不錯!今天的面試就到這邊，如果有什麼消息，我們會再通知你!!

## 自我檢討:
### 針對interviewer:
* 雖然有嘗試包裝題目，不過好像有點過頭導致題目主幹有點不見的感覺，且為了包裝題目，有些限制並未實際說清楚。
* 題目有點太開放性作答的感覺(不知是好是壞?)。
* 有些地方說話卡卡的。

### 針對interviewee:
* 在approach方面還是說明的不夠仔細，還是很明顯地想要趕快寫code。
* 在說明程式碼或者是在驗證時一直動滑鼠滾輪會讓人不太舒服。
* 說明改進方法二時，先給array比較大的空間的地方([0,0,0,0,0])，說明的不太清楚。

## 他評01
* interviewee 的檢討
    * [9:21](https://youtu.be/L0pNVBA3epk?t=561) 要注意可能因為緊張導致腦袋想的與講出來的有出入 (不小於等於 1)
    * [21:49](https://youtu.be/L0pNVBA3epk?t=1309) 補 0 的部分我認為可以用下面的方法改寫，可以避免原本取 index 都要去運算 `numsSize - i - 1`，也可以透過現有函式庫去初始化
        ```c
        for(int i = numsSize - count; i < numsSize; ++i) {
            nums[i] = 0;
        }
        or
        memset(&nums[numsSize - count],0 , sizeof(int) * count);
        ```
        另外或許可以將維修需求包裝成一個結構體，capacity 表示可接受的維修需求數，available 表示要回應的維修需求數，這樣就不用補 0 了
        ```c
        struct service {
            int capacity;
            int available;
            int *announce_id;
        }
        ```
    * [7:30](https://youtu.be/L0pNVBA3epk) : 如果怕面試過程感覺卡卡的，可先將想法以註解寫下，在將code實做出來

    * [10:20](https://youtu.be/L0pNVBA3epk) : 提供例子測試的部分做得很清楚，很好
* interviewer 的檢討
    * 或許可以進一步問要是有多位心急的工程師同時去按維修通報該怎麼處理 (可能的解法 : 設一個 timer => 排序陣列 => 移除重複的)
        ```
        ex:
        [1,2,1,2,1,3,1,2,3]
        ```
    * [15:07](https://youtu.be/L0pNVBA3epk) : 在協助interviewee最佳化程式的過程可提出一些hint來觀察interviewer是否符合公司所想找的人
    * [0:01](https://youtu.be/L0pNVBA3epk?si=SG-wEyHvCxywIPp1) :覺得從一開始interviwer的聲量略顯有氣無力，在聆聽題目時較為吃力。

## 他評02
* interviewee 的檢討
    * [4:23](https://www.youtube.com/watch?v=L0pNVBA3epk)  :寫程式的時候建議不要直接唸出變數，而應該說明目前實作的功能是甚麼，變數則透過宣告的名稱讓人了解該功能是甚麼即可。
* interviewer 的檢討
    * 或者在討論interviewee的複雜度檢討的時候，可以多提供別的做法的複雜度做為參考，避免以＂不錯＂、＂還可以＂這種單詞來互動。