1. 程式人生 > >LeetCode刷題EASY篇如何快速反轉一個字串

LeetCode刷題EASY篇如何快速反轉一個字串

題目

Write a function that takes a string as input and returns the string reversed.

Example 1:

Input: "hello"
Output: "olleh"

Example 2:

Input: "A man, a plan, a canal: Panama"
Output: "amanaP :lanac a ,nalp a ,nam A"

我的嘗試

上一篇文章中,反轉一個整數,我的思路其實是用來解決字串比較合適,因為不涉及負號和0等問題。用空間換時間,我的成功程式碼如下:

class Solution {
    public String reverseString(String string) {
        char[] chars = string.toCharArray();
        char[] charRes = new char[chars.length];
        for (int i = chars.length - 1; i >= 0; i--) {
            charRes[chars.length - i - 1] = chars[i];
        }
        return String.valueOf(charRes);
    }
}

優化方法

leetcode此題沒有給出答案,不過看到一個夥伴的js程式碼,突然發現除了上面的空間換時間方法外,另外的一個方法:

倒序輸出其實就是兩個元素交換,指定兩個指標,一個從頭i,一個從尾j,當i<j時,利用一個char空間儲存臨時元素,進行交換。然後移動指標即可,空間複雜度比我原來的演算法低,而且時間複雜度也是O(n)。我很快就寫出來java版本。

演算法的三個武器:

  • 兩個指標,同時遍歷,移動處理問題
  • 對於連續的問題,利用滑動視窗,計算當前視窗的值,然後進行增加或者刪除
  • 空間換時間解決問題,比如我的演算法
class Solution {
    public String reverseString(String string) {
        char[] chars = string.toCharArray();
        int i = 0, j = chars.length - 1;
        char temp;
        while (i < j) {
            temp = chars[i];
            chars[i] = chars[j];
            chars[j] = temp;
            i++;
            j--;
        }
        return String.valueOf(chars);
    }
}