【LeetCode_344】反轉字串_Python&Java_雙指標解法

擒拿一隻鹹魚幹發表於2020-11-08

參考部分,如有侵權,請聯絡刪除。

編寫一個函式,其作用是將輸入的字串反轉過來。輸入字串以字元陣列 char[] 的形式給出。

不要給另外的陣列分配額外的空間,你必須原地修改輸入陣列、使用 O(1) 的額外空間解決這一問題。

你可以假設陣列中的所有字元都是 ASCII 碼錶中的可列印字元。

示例 1:

輸入:[“h”,“e”,“l”,“l”,“o”]
輸出:[“o”,“l”,“l”,“e”,“h”]

示例 2:

輸入:[“H”,“a”,“n”,“n”,“a”,“h”]
輸出:[“h”,“a”,“n”,“n”,“a”,“H”]

方法一、遍歷交換

思路:字串陣列要麼長度為偶數要麼長度為奇數。然後以mid為對稱交換。

Java解法

class Solution {
    public void reverseString(char[] s) {
        int n = s.length,mid = 0;
        if(n%2 == 0){
            mid = n/2-1;
        }
        else{
            mid = n /2;
        }
        char temp = 0;
        for(int i = n-1;i>mid;i--){
            temp = s[i];
            s[i] = s[n-1-i];
            s[n-1-i] = temp;
        }
    }
}

耗時1ms

複雜度分析

時間複雜度:O(N),其中 N 為字元陣列的長度。一共執行了 N/2次的交換。
空間複雜度:O(1)。只使用了常數空間來存放若干變數。

方法二、Python列表

Python解法1

思路:因為s是個列表,所以直接reverse

class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        s.reverse()

耗時48ms

Python解法2

參考Python3 兩種方法實現反轉字串
思路:另一種倒序解法s[::-1]

class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        s[:] = s[::-1]

耗時40ms

但是這裡我不太理解為什麼不是s = s[::-1],然後看了參考的解釋就明白了
s[:]=s[::-1]表示將原陣列反轉後賦值給s中每一個對應的位置
s=s[::-1]表示將s反轉後賦值給新的物件s(可以通過id函式檢視記憶體地址),與題意原地修改不符。
Bingo!!!!

方法三:雙指標

官方解答
思路
前後交換
將 left 指向字元陣列首元素,right 指向字元陣列尾元素。
當 left < right:
交換 s[left] 和 s[right];
left 指標右移一位,即 left = left + 1;
right 指標左移一位,即 right = right - 1。
當 left >= right,反轉結束,返回字元陣列即可。

class Solution {
    public void reverseString(char[] s) {
        int n = s.length;
        for (int left = 0, right = n - 1; left < right; ++left, --right) {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
        }
    }
}

複雜度分析

時間複雜度:O(N),其中 N 為字元陣列的長度。一共執行了 N/2次的交換。
空間複雜度:O(1)。只使用了常數空間來存放若干變數。

總結

比較推薦第一種和第三種解法。第一種是我自己寫,接近雙100%。

博主比較小白,但是熱愛分享。一直感覺自己寫程式碼的能力,演算法能力都不太行,所以最近開始刷LeetCode,一方面記錄方便自己學習,另一方面給需要的同伴參考。雖然失敗並不可怕,但是也希望同伴們少踩一些坑。分析演算法挺費勁的,留個贊或評論支援一下博主吧!同時我也非常希望寫出更通俗易懂的文章,知識尚淺,如有遺漏或錯誤,歡迎指正~

相關文章