---
tags: info2023-homework2
---
# 2023 年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2023/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FS11ooE4Rh)」作業2
## 1. 互評部分
### 同學一([埃默里-Emery](https://hackmd.io/@sysprog/rJO3aSTJ6))
#### interviewer
- [ ] 優點
* 有針對完成的程式碼提出回應,並且引導面試者提出更好的解法。
- [ ] 可改進的地方
* [00:10](https://www.youtube.com/watch?v=GlGLS3aAvOc):可以想想情境題,比如說這題可以假設在做市場調查,我們想知道在K個小時(索引值)內有沒有兩個人以上買過這個商品(元素)
#### interviewee
- [ ] 優點
* 整體在寫程式時都很順暢,讓面試官可以很清楚現在做到哪裡了。
- [ ] 可改進的地方
* [00:26](https://www.youtube.com/watch?v=GlGLS3aAvOc):在回答面試官問題時,把想法打在電腦上感覺會讓面試官比較好確認你的理解是否正確
*
### 同學二([查理-Charlie](https://hackmd.io/@sysprog/HyEYCSpyp))
#### interviewer
- [ ] 優點
- 題目解釋的很清楚,而且一開始就有出現在上面了,方便面試者閱讀。
- [ ] 可改進之處
- 在出題時的語調感覺可以再更自然一些。
#### interviewee
- [ ] 優點
- 可以邊寫程式邊解釋目前做到哪裡,很厲害!
- [ ] 可改進之處
- [01:54](https://youtu.be/dVpY2ObOC2I?si=H8wYc6e84M33XfuY&t=114): 在描述想法時可以把它打出來,可以讓面試官更理解。
### 同學三([月前龍馬-lonmu](https://hackmd.io/@sysprog/SkzGyUayT))
#### interviewer
- [ ] 優點
- 題目和條件都解釋得很清楚,語速也很順暢自然。
- [ ] 可改進的地方
- 面試者發現括號錯誤,可以提醒,增加互動性。
#### interviewee
- [ ] 優點
- 寫完時有針對example的部分做test。
- [ ] 可改進的地方
- [00:56](https://youtu.be/ylDgHkwjpIw?si=dKOBhKKc8KARn89T&t=55): for example是e.g.,用EX不太正式。
### 同學四([盲狗-Mango](https://hackmd.io/@sysprog/Syvm18aka))
#### interviewer
- [ ] 優點
- [13:18](https://youtu.be/sqPCM6ESEZg?si=igU6goXCf72nlWEy&t=798):針對程式碼有提供具體的問題,增加討論的空間。
- [ ] 可改進的地方
- 若可以用一些生活的例子或是情境來包裝題目會更好。
#### interviewee
- [ ] 優點
- 整個面試的過程很自然而且很流暢,說明也很清楚。
- [ ] 可改進的地方
- [00:56](https://youtu.be/sqPCM6ESEZg?si=7-QywUbm-qumvW0y&t=56):在打例子時我覺得可以稍微說明或是說點話,讓空氣不要太安靜
### 同學五([李一-Pear](https://hackmd.io/@sysprog/SkC2xITJT))
#### interviewer
- [ ] 優點
- [00:06](https://youtu.be/EHdy7qDeJoY?si=CfCE6-Ja8c41lzhq&t=6):題目有用情境題包裝,可以避免面試者背答案。
- [ ] 可改進的部分
- 面試官問問題時除了針對題目改善外,應該要想如何找出面試者的思維邏輯,譬如說,他是如何想到第二種解法,為什麼一開始想不到?
#### interviewee
- [ ] 優點
- 寫程式時的速度跟語速可以讓聽的人很清楚解題過程跟邏輯。
- [ ] 可改進的部分
- 有時候調整程式架構會太安靜,可以說些話,比如說接下來的步驟。
### 評論完心得
```
看完別人的面試後,我有很多部分需要改進
1.要包裝題目讓面試者無法一眼看出考題
2.雙方的討論性不夠強,所以做題都是直接暴力法,應該要討論到一個階段才寫code
3.英文還需要多練習講話
```
## 2. 模擬面試
### [2295. Replace Elements in an Array](https://leetcode.com/problems/replace-elements-in-an-array/description/)
> 貢獻者: 甲魚-baspis
> 🧔:interviewer 👶:interviewee
>
> ==[video](https://youtu.be/rtYpyDLbaTQ)==
### 面試過程
🧔:嗨同學你好,歡迎你來參加我們這次的線上面試,在這次的面試中我會給你一些問題,希望你可以提供想法並且試著實作出來,那麼我們就馬上開始吧!
🧔:我們公司想要加強保護資料的機制,我們想到了一個方法是使用加密的方式來讓原本的資料轉換成密文,這裡我們先給一個整數陣列$nums$當作是原資料,加密金鑰我們想要採用置換數字的方式,給予你多個置換的步驟,按照步驟將資料加密,最後就會出現所需要的密文。
🧔:舉例來說,原資料假設為[1 2 4 6],給定加密金鑰為{[1,3]},我們就將原資料的1置換,而成為[3 2 4 6],加密金鑰可能有多組讓整個過程複雜化來提高保護性,也保證每個置換的步驟都可以正確地執行。請問到目前為止可以理解問題嗎?
👶:針對題目我想要舉個例子來確定我是否了解,假設原資料為[1 2 4 6],加密金鑰為{[1,3],[4,5],[5,7]},那加密過程就是..這樣對嗎?
```
Given nums[1 2 4 6] and operations{[1,3],[4,5],[5,7]}
run0=[1 2 4 6]
run1=[3 2 4 6]
run2=[3 2 5 6]
run3=[3 2 7 6]
```
🧔:你的理解沒錯,那想問你有什麼想法嗎?
👶:我目前初步的想法是使用for迴圈來取得金鑰中要置換的兩個數字,然後再利用for迴圈來拜訪原資料找到它的位置。
```
1. for() -> get old num,new num
2. for() -> find old num location and replace
```
🧔:聽起來可行,但我們公司的加密過程一定是很複雜的,這樣的方式會讓我們每次加密都需要花很長的時間,有沒有辦法讓你目前思維的某個架構變快,比如說找位置的速度變快或是置換速度變快之類的。
👶:如果要加快找位置的速度的話,我們可以使用unordered map來儲存原資料,因為使用unordered map找到數的時間複雜度為$O(1)$,相較於使用for迴圈是$O(N)$的速度來的快。
```
nums[1 2]
map[1]=0
map[2]=1
operations{[1 3]}
search map[1]->0
replace num[0] with 3
update map(我們要把舊的數字剔除map)
```
🧔:聽起來對於加速確實有幫助,那我們可以來將剛剛討論的結果寫出來看看嗎?
```cpp=
# Time: O(n)
# Space: O(1)
class Solution {
public:
vector<int> arrayChange(vector<int>& nums, vector<vector<int>>& operations) {
unordered_map<int,int>map;
for(int i=0;i<nums.size();i++){
map[nums[i]]=i;
}
for(int i=0;i<operations.size();i++){
int old_num=operations[i][0];
int new_num=operations[i][1];
int location=map[old_num];
nums[location]=new_num;
map[new_num]=location;
map.erase(old_num);
}
return nums;
}
};
```
👶:我的程式碼完成了,接著用上面的例子[1 2 4 6]來測試的話...,確定這個程式碼可以運行。
```
nums[1 2 4 6] and operations{[1,3],[4,5],[5,7]}
1.建立map
map[1]=0
map[2]=1
map[4]=2
map[6]=3
2. for loop
run1: old=1 new=3
map[1]=0 -> map[3]=0 and del map[1]
nums -> [3 2 4 6]
run2: old=4 new=5
map[4]=2 -> map[5]=2 and del map[4]
nums -> [3 2 5 6]
run3: old=5 new=7
map[5]=2 -> map[7]=2 and del map[5]
nums -> [3 2 7 6]
```
👶:以上是我的程式碼,如果使用unordered map的話,可以讓整體時間複雜度變為$O(N)$,請問對於程式碼有什麼建議或是可以修改的地方嗎?
🧔:這裡看的出來你為了讓程式的每個步驟更清楚,因此使用了很多變數來區分,但我們希望這個加密的程式可以越簡單越好,可以請你調整一下裡面的內容讓程式碼可以精簡化嗎?
👶:如果要精簡程式的話,old_num和new_num和location其實都可以只使用operation表示就可以了,那我就直接調整程式碼。
```cpp=
# Time: O(n)
# Space: O(1)
class Solution {
public:
vector<int> arrayChange(vector<int>& nums, vector<vector<int>>& operations) {
unordered_map<int,int>map;
for(int i=0;i<nums.size();i++){
map[nums[i]]=i;
}
for(int i=0;i<operations.size();i++){
nums[map[operations[i][0]]]=operations[i][1];
map[operations[i][1]]=map[operations[i][0]];
map.erase(operations[i][0]);
}
return nums;
}
};
```
👶:調整後的程式碼相較於上一個可以精簡三行,請問這裡還有什麼可以改進的地方或是建議嗎?
🧔:看起來程式碼對於我們的加密資料提供了不錯的想法,那我給你一些延伸的問題可以回去想想,像是如果解密要怎麼做,以及哪種加密方式的隱密性更高可以等等,今天的面試就到這裡,謝謝你今天的參與!