题意描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1)
的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII
码表中的可打印字符。
示例:
示例一:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例二:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
解题思路:
Alice: 哈哈哈,这题目,直接 reverse
一下不就得了。
Bob: 就是不知道 reverse 方法是不是 O(1)
的空间复杂度。而且这道题目应该就是想让我们实现 reverse
方法的吧。
Alice: 那就直接把对应的字符送到指定位置呗,一步到位,直接交换对应位置的字符。比如说 s[0],s[len(s)-1]
交换,s[1],s[len(s)-2]
交换,等等等等。
Bob: 那就直接循环一遍好了,做两个指针,一个是 x
, 一个是 len(s) - 1 - x
。
Alice: 哈哈哈,也可以一个双指针啊,一个从 0
变大,从左往右,一个从 len(s)-1
变小,从右往左,直到两个指针相遇就好了。
Bob: 😎😎
代码:
Python 方法一:使用列表的 reverse
方法
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s.reverse()
Python 方法二:双指针法, 交换数组中两个对应位置上的字符,直到完成整个字符串的反转。
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
for x in range(0, len(s)//2):
s[x], s[len(s) - 1 - x] = s[len(s) - 1 - x], s[x]
Java 方法二:双指针法,交换数组中两个对应位置上的字符,直到完成整个字符串的反转。
class Solution {
public void reverseString(char[] s) {
char tmp;
// O(1) 的额外空间
for(int i=0; i<s.length/2; ++i){
// 每次交换前后的两个元素,直至将所有元素都反转过来。
tmp = s[i];
s[i] = s[s.length - 1 - i];
s[s.length -1 - i] = tmp;
}
}
}
易错点:
- 下标
length - 1 - x
的字符 应与 下标x
的字符交换位置,注意不要越界访问数组。
总结: