iT邦幫忙

2021 iThome 鐵人賽

DAY 9
1
自我挑戰組

試煉之地 Leetcode 的挑戰系列 第 9

Leetcode 挑戰 Day 09 [344. Reverse String]

344. Reverse String


今天這一題是將一個字元陣列翻轉過來,題目看似很單純,但也有一些技巧和知識在其中可以使用的!有感於題目中範例如果用程式碼包起來,會導致某些單詞被認為是程式用語而顏色不同不便閱讀,因此在之後的題目範例會用引用的方式,希望能增加可讀性。

題目


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)。

Two pointers


以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;
        }
    }
};

上一篇
Leetcode 挑戰 Day 08 [191. Number of 1 Bits]
下一篇
Leetcode 挑戰 Day 10 [171. Excel Sheet Column Number]
系列文
試煉之地 Leetcode 的挑戰19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言