貢獻者: 甲魚-baspis
🧔:interviewer 👶:interviewee
🧔:嗨同學你好,歡迎你來參加我們這次的線上面試,在這次的面試中我會給你一些問題,希望你可以提供想法並且試著實作出來,那麼我們就馬上開始吧!
🧔:我們公司想要加強保護資料的機制,我們想到了一個方法是使用加密的方式來讓原本的資料轉換成密文,這裡我們先給一個整數陣列當作是原資料,加密金鑰我們想要採用置換數字的方式,給予你多個置換的步驟,按照步驟將資料加密,最後就會出現所需要的密文。
🧔:舉例來說,原資料假設為[1 2 4 6],給定加密金鑰為{[1,3]},我們就將原資料的1置換,而成為[3 2 4 6],加密金鑰可能有多組讓整個過程複雜化來提高保護性,也保證每個置換的步驟都可以正確地執行。請問到目前為止可以理解問題嗎?
👶:針對題目我想要舉個例子來確定我是否了解,假設原資料為[1 2 4 6],加密金鑰為{[1,3],[4,5],[5,7]},那加密過程就是..這樣對嗎?
🧔:你的理解沒錯,那想問你有什麼想法嗎?
👶:我目前初步的想法是使用for迴圈來取得金鑰中要置換的兩個數字,然後再利用for迴圈來拜訪原資料找到它的位置。
🧔:聽起來可行,但我們公司的加密過程一定是很複雜的,這樣的方式會讓我們每次加密都需要花很長的時間,有沒有辦法讓你目前思維的某個架構變快,比如說找位置的速度變快或是置換速度變快之類的。
👶:如果要加快找位置的速度的話,我們可以使用unordered map來儲存原資料,因為使用unordered map找到數的時間複雜度為,相較於使用for迴圈是的速度來的快。
🧔:聽起來對於加速確實有幫助,那我們可以來將剛剛討論的結果寫出來看看嗎?
👶:我的程式碼完成了,接著用上面的例子[1 2 4 6]來測試的話…,確定這個程式碼可以運行。
👶:以上是我的程式碼,如果使用unordered map的話,可以讓整體時間複雜度變為,請問對於程式碼有什麼建議或是可以修改的地方嗎?
🧔:這裡看的出來你為了讓程式的每個步驟更清楚,因此使用了很多變數來區分,但我們希望這個加密的程式可以越簡單越好,可以請你調整一下裡面的內容讓程式碼可以精簡化嗎?
👶:如果要精簡程式的話,old_num和new_num和location其實都可以只使用operation表示就可以了,那我就直接調整程式碼。
👶:調整後的程式碼相較於上一個可以精簡三行,請問這裡還有什麼可以改進的地方或是建議嗎?
🧔:看起來程式碼對於我們的加密資料提供了不錯的想法,那我給你一些延伸的問題可以回去想想,像是如果解密要怎麼做,以及哪種加密方式的隱密性更高可以等等,今天的面試就到這裡,謝謝你今天的參與!