今天這一題是將一個字元陣列翻轉過來,題目看似很單純,但也有一些技巧和知識在其中可以使用的!有感於題目中範例如果用程式碼包起來,會導致某些單詞被認為是程式用語而顏色不同不便閱讀,因此在之後的題目範例會用引用的方式,希望能增加可讀性。
Write a function that reverses a string. The input string is given as an array of characters s.
Example 1:
Input: s = ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]Example 2:
Input: s = ["H","a","n","n","a","h"]
Output: ["h","a","n","n","a","H"]
Follow up: Do not allocate extra space for another array. You must do this by modifying the input array in-place with O(1) extra memory.
這題的意思還蠻單純的,就是希望我們能把一個字元陣列翻轉過來,並且這題是不用回傳任何東西的,只要修改題目給我們的陣列內容!但是他有一個額外的條件,那就是希望我們能保持空間複雜度為O(1)。
以python來說,使用內建函示list.reverser()當然可以很快達到這題的要求,但這樣也會失去練習的意義,仔細思考這題其實有一個蠻不錯的方法,那就是我們通過雙指針的方式,一個從頭、一個從尾開始遍歷,每次互相交換值後並向內一格,當他們碰在一起或是相鄰時,我們的演算法也就結束了,此時字串已經是呈現顛倒過來的狀態,原因是顛倒一個字元陣列事實上就是把第i個元素放到第list.length()-i-1的位置,而反之亦然。
而在python中,我們可以透過for迴圈與[-index]來達到雙指標的效果,以下為python3的程式碼。
class Solution:
def reverseString(self, s: List[str]) -> None:
for i in range(len(s) // 2):
s[i] , s[-(i+1)] = s[-(i+1)], s[i] # 不斷使兩變數互換,達到反轉效果
上述這樣將兩個變數的值互換的方法,其實使用了python的內建語法,python會自動幫我們處理好,而不需要建立一個temp的變數。但在其他語言中,可能需要以手動的做法將temp變數建立起來,然後再互換,以避免忘掉其中的值。
以下是C++的程式碼
class Solution {
public:
void reverseString(vector<char>& s) {
int i;
int m = s.size(); //陣列長度
char temp;
for(i=0;i<m/2;i++){
temp = s[i]; //暫時存放變數
s[i] = s[m-(i+1)];
s[m-(i+1)] = temp;
}
}
};