1. 题目链接
2. 思路
双指针法
对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。一共执行了 N/2次的交换。
对于长度为 N 的待被反转的字符数组,我们可以观察反转前后下标的变化,假设反转前字符数组为 s[0] s[1] s[2] … s[N - 1],那么反转后字符数组为 s[N - 1] s[N - 2] … s[0]。比较反转前后下标变化很容易得出 s[i] 的字符与 s[N - 1 - i] 的字符发生了交换的规律,因此我们可以得出如下双指针的解法:
- 将 left 指向字符数组首元素,right 指向字符数组尾元素。
- 当 left < right:
1)交换 s[left] 和 s[right];
2) left 指针右移一位,即 left = left + 1;
3) right 指针左移一位,即 right = right - 1。 - 当 left >= right,反转结束,返回字符数组即可。
3.代码实现
3.1 c++实现
class Solution {
public:
void reverseString(vector<char>& s) {
for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) {
swap(s[i],s[j]);
}
}
};
//或者
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
for (int left = 0, right = n - 1; left < right; ++left, --right) {
swap(s[left], s[right]);
}
}
};
3.2 c实现
void swap(char *a, char *b) {
char t = *a;
*a = *b, *b = t;
}
void reverseString(char *s, int sSize) {
for (int left = 0, right = sSize - 1; left < right; ++left, --right) {
swap(s + left, s + right);
}
}
4.复杂度分析
- 时间复杂度:O(N),其中 N 为字符数组的长度。一共执行了 N/2次的交换。
- 空间复杂度:O(1)。只使用了常数空间来存放若干变量。