Description
給定字元陣列
s,原地反轉字串。必須使用 O(1) 額外空間。
Example:
Input: s = [‘h’,’e’,’l’,’l’,‘o’] Output: [‘o’,’l’,’l’,’e’,‘h’]
Intuition#
核心思路:左右指針相向移動,逐一交換字元。
- 反轉陣列最經典的做法就是首尾交換
- 兩個指針分別從頭尾出發,向中間靠攏,每步交換
Approaches#
1: 使用標準函式庫#
- 概念: 直接呼叫
reverse()函式 - 時間複雜度:
O(n) - 空間複雜度:
O(1)
class Solution {
fun reverseString(s: CharArray): Unit {
s.reverse()
}
}⭐2: Two Pointers 交換#
- 概念: 左右指針相向移動,交換對應位置的字元
- 時間複雜度:
O(n)- 遍歷一半的陣列 - 空間複雜度:
O(1)- 只用兩個指針和一個暫存
class Solution {
fun reverseString(s: CharArray): Unit {
var left = 0
var right = s.size - 1
while (left < right) {
val temp = s[left]
s[left] = s[right]
s[right] = temp
left++
right--
}
}
}Kotlin 的
also可以讓交換更簡潔:s[left] = s[right].also { s[right] = s[left] },但面試中 temp 變數更清晰。
🔑 Takeaways#
- Pattern: 相向雙指針交換,是原地反轉的基礎操作
- 關鍵技巧: 此技巧是許多進階問題的子程序(如反轉句子中的單字、旋轉陣列等)