力扣链接:344. 反转字符串,难度:简单。
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须 原地 修改输入数组、使用 O(1)
的额外空间解决这一问题。
示例 1:
输入: s = ["h","e","l","l","o"]
输出: ["o","l","l","e","h"]
示例 2:
输入: s = ["H","a","n","n","a","h"]
输出: ["h","a","n","n","a","H"]
约束:
1 <= s.length <= 10^5
s[i]
都是 ASCII 码表中的可打印字符
提示 1
The entire logic for reversing a string is based on using the opposite directional two-pointer approach!
思路
- 这种问题用编程语言内置的
sort()
方法可以一行代码解决。如果面试中出这种题目,出题人考察的应该是不用内置方法如何做。 - 用方向相对的两个指针,最初时一个指针指向下标
0
,另一个指针指向下标s.length - 1
。 - 遍历数组元素,循环条件为
while (left < right)
。在循环体内,left += 1
,right -= 1
。 - 在循环体内,交换数组中两个下标对应的值。
- 以上为
方向相对
的双指针的模板。
步骤
用方向相对的两个指针,最初时一个指针指向下标
Copy0
,另一个指针指向下标s.length - 1
。left = 0 right = s.length - 1
遍历数组元素,循环条件为
Copywhile (left < right)
。在循环体内,left += 1
,right -= 1
。left = 0 right = s.length - 1 while left < right # 1 left += 1 # 2 right -= 1 # 3 end
在循环体内,交换数组中两个下标对应的值。
Copyleft = 0 right = s.length - 1 while left < right s[left], s[right] = s[right], s[left] # 1 left += 1 right -= 1 end
复杂度
时间复杂度
O(N)
空间复杂度
O(1)
Java #
Copy
class Solution {
public void reverseString(char[] s) {
var left = 0;
var right = s.length - 1;
while (left < right) {
var leftValue = s[left];
s[left] = s[right];
s[right] = leftValue;
left++;
right--;
}
}
}
Python #
Copy
class Solution:
def reverseString(self, s: List[str]) -> None:
left = 0
right = len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
C++ #
Copy
class Solution {
public:
void reverseString(vector<char>& s) {
auto left = 0;
auto right = s.size() - 1;
while (left < right) {
swap(s[left], s[right]);
left++;
right--;
}
}
};
JavaScript #
Copy
var reverseString = function (s) {
let left = 0
let right = s.length - 1
while (left < right) {
[s[left], s[right]] = [s[right], s[left]]
left++
right--
}
};
C# #
Copy
public class Solution
{
public void ReverseString(char[] s)
{
int left = 0;
int right = s.Length - 1;
while (left < right)
{
(s[left], s[right]) = (s[right], s[left]);
left++;
right--;
}
}
}
Go #
Copy
func reverseString(s []byte) {
left := 0
right := len(s) - 1
for left < right {
s[left], s[right] = s[right], s[left]
left++
right--
}
}
Ruby #
Copy
def reverse_string(s)
left = 0
right = s.size - 1
while left < right
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
end
end