# 344. 反转字符串 - 力扣题解最佳实践
访问原文链接:[344. 反转字符串 - 力扣题解最佳实践](https://leetcoder.net/zh/leetcode/344-reverse-string),体验更佳!
力扣链接:[344. 反转字符串](https://leetcode.cn/problems/reverse-string), 难度:**简单**。
## 力扣“344. 反转字符串”问题描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 `s` 的形式给出。
不要给另外的数组分配额外的空间,你必须 [原地](https://en.wikipedia.org/wiki/In-place_algorithm) **修改输入数组**、使用 `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 码表中的可打印字符
### [Hints]
提示 1
The entire logic for reversing a string is based on using the opposite directional two-pointer approach!
## 思路
1. 这种问题用编程语言内置的`sort()`方法可以一行代码解决。如果面试中出这种题目,出题人考察的应该是不用内置方法如何做。
2. 用**方向相对**的两个指针,最初时一个指针指向下标`0`,另一个指针指向下标`s.length - 1`。
3. 遍历数组元素,循环条件为`while (left < right)`。在循环体内,`left += 1`, `right -= 1`。
4. 在循环体内,交换数组中两个下标对应的值。
5. 以上为`方向相对`的**双指针**的模板。
## 步骤
1. 用**方向相对的两个指针**,最初时一个指针指向下标`0`,另一个指针指向下标`s.length - 1`。
```ruby
left = 0
right = s.length - 1
```
2. 遍历数组元素,循环条件为`while (left < right)`。在循环体内,`left += 1`, `right -= 1`。
```ruby
left = 0
right = s.length - 1
while left < right # 1
left += 1 # 2
right -= 1 # 3
end
```
3. 在循环体内,交换数组中两个下标对应的值。
```ruby
left = 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
```java
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
```python
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++
```cpp
class Solution {
public:
void reverseString(vector& s) {
auto left = 0;
auto right = s.size() - 1;
while (left < right) {
swap(s[left], s[right]);
left++;
right--;
}
}
};
```
## JavaScript
```javascript
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#
```csharp
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
```go
func reverseString(s []byte) {
left := 0
right := len(s) - 1
for left < right {
s[left], s[right] = s[right], s[left]
left++
right--
}
}
```
## Ruby
```ruby
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
```
## Other languages
```java
// Welcome to create a PR to complete the code of this language, thanks!
```
亲爱的力扣人,为了您更好的刷题体验,请访问 [leetcoder.net](https://leetcoder.net/zh)。
本站敢称力扣题解最佳实践,终将省你大量刷题时间!
原文链接:[344. 反转字符串 - 力扣题解最佳实践](https://leetcoder.net/zh/leetcode/344-reverse-string).
GitHub 仓库: [f*ck-leetcode](https://github.com/fuck-leetcode/fuck-leetcode).