作者:江不知
题解项目:LeetCode Notebook
编程拯救世界(ID: CodeWarrior_):专注于编程基础与服务端研发。
该系列题目取自 LeetCode 精选 TOP 面试题列表:https://leetcode-cn.com/problemset/top/
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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"]
解题思路
由于题目要求空间复杂度为 O(1),即不能使用额外空间,所以我们考虑用双指针+循环交换的方式来解答本题。
以 ["h","e","l","l","o"]
为例,开始时,初始化两个指针 i
和 j
,分别指向该字符串的首部和尾部:
此时 i
指向字符 h
,j
指向字符 o
,为了完成题目要求的「反转」,我们交换 i
和 j
所指向的字符:
交换完毕后,得到字符串 ["o","e","l","l","h"]
。
为了进行下一轮交换,我们移动双指针:将 i
向右移动 1 位,将 j
向左移动 1 位:
此时,i
指向字符 e
,j
指向字符 l
,继续交换两者:
此时得到字符串 ["o","l","l","e","h"]
,继续移动双指针:
此时发现 i
与 j
相遇,交换过程结束。
上述交换过程得到的结果 ["o","l","l","e","h"]
即为我们最终想要的答案。
总结一下
整体步骤如下:
- 我们设置两个指针
i
和j
,初始化时,将i
指向字符串头部,j
指向字符串尾部 - 当
i < j
时,交换i
与j
所指向的字符,即完成题目所要求的「反转」。交换完成后移动双指针:将i
向右移动 1 位,j
向左移动 1 位 - 当
i >= j
时,结束循环,并得到最终答案
具体实现
Python
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
length = len(s)
i = 0
j = length - 1
while i < j:
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
Go
func reverseString(s []byte) {
i := 0
j := len(s) - 1
for i < j {
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
}
}
PHP
class Solution {
/**
* @param String[] $s
* @return NULL
*/
function reverseString(&$s) {
$i = 0;
$j = count($s) - 1;
while ($i < $j) {
$tmp = $s[$i];
$s[$i] = $s[$j];
$s[$j] = $tmp;
$i++;
$j--;
}
}
}
复杂度
- 时间复杂度:
O(n)
- 空间复杂度:
O(1)