題目 #
leetcode 344 - Reverse String(題目說明請點連結)
題目簡述 #
反轉一個字串陣列。
Example 1:
Input: s = ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]
Explanation: 反轉字串陣列,將 "hello" 變成 "olleh"。Example 2:
Input: s = ["H","a","n","n","a","h"]
Output: ["h","a","n","n","a","H"]
Explanation: 反轉字串陣列,將 "Hannah" 變成 "hannaH"。解題思路 #
輸入為一個陣列,輸入為一個反方向陣列的內容,過程中不能建立額外的空間。
給定index i為0、j陣列長度-1。
隨著迴圈次數,i逐漸遞增,j逐漸遞減,中止條件當i>j,也就是到中間時交換完畢。
例子說明 #
s = ["h","e","l","l","o"]
- 初始情況:
i = 0,j = 4,s = ["h","e","l","l","o"]
-
第一次迭代:
- 交換
s[0]和s[4] s = ["o","e","l","l","h"]i++,j--,i = 1,j = 3
- 交換
-
第二次迭代:
- 交換
s[1]和s[3] s = ["o","l","l","e","h"]i++,j--,i = 2,j = 2
- 交換
-
第三次迭代:
i = 2,j = 2,i == j,停止迭代- 最終結果:
s = ["o","l","l","e","h"]
完整程式碼 #
java
class Solution {
public char[] reverseString(char[] s) {
// 初始化兩個指針,i從開頭開始,j從結尾開始
int i = 0;
int j = s.length - 1;
while(i < j) { // 當i小於j時繼續交換
char tmp = s[i]; // 暫存i位置的字符
s[i] = s[j]; // 將j位置的字符放到i位置
s[j] = tmp; // 將暫存的字符放到j位置
i++; // i指針向右移動
j--; // j指針向左移動
}
return s; // 返回反轉後的字符數組
}
}時間複雜度 #
- 時間複雜度:O(n),其中 n 是字符數組的長度
- 空間複雜度:O(1),只使用了常數額外空間