來自 LIOJ 上的題目,這題實作的東西蠻有趣的,而且這次想到了不同的解法,所以想記錄下來。
解題方向
這一題只要把字串轉成對應的 ASCII CODE,再加上位移量就可以做到位移的動作。唯一要注意的是範圍在 97 ~ 122
之間。
所以這一題的難點在於:當位移後的數字超過 122 時怎麼處理?
解法一 While 迴圈法
這種解法應該是比較直覺的想法:
1 | function solve(lines) { |
這裡如果沒有注意的話會不小心把 while(m > 122)
寫成 if(m > 122)
。
這樣是不對的,因為當 n
的值大於 26
時,(m % 122) + 96
的值就會超過 122,舉個例子:
1 | // 假設 n 為 27 |
所以一定要用 while
來處理,才能確保 m
一定落在 97 ~ 122
這個範圍。
解法一 取餘數大法
這一個解法如果想通後會覺得很直覺。
首先,你知道英文字母總共只有 26 個,接著你再想想下面這兩個案例:
- 如果往右位移
26
次,是不是就等於沒有動? - 如果往右移
27
次,是不是就等同往右移1
次?
從這兩個案例中應該能發現一些事情吧?
沒錯,我們只要把「位移量 % 26」,就可以求出實際要位移的次數。
所以其實只要把第一種解法稍微修改一下就好了:
1 | function solve(lines) { |
可以注意到 while
變成了 if
。
這是因為現在的 n
絕對不會超過 26 這個範圍,也就是說 (m % 122) + 96
值絕對不會超過 122,所以這個動作只要做一次就夠了。
雖然不知道這解法對實際效能的影響如何,但能拿掉迴圈看了就是舒服!