简述
输入一个字符串,输出一个反转后的字符串。
这个问题比较简单,解题思路也很多:
- 使用std::reverse()函数
- 从末尾开始读取原字符串,将其放入一个新建的字符串中
- 遍历字符串,首尾交换位置,奇数位的中间元素不用交换
- 双指针法,即使用两个指针,一个指向开头,一个指向结尾,只要开头小于结尾,就把这两个位置的元素互换
- 递归法,即递归字符串的开始位置和结尾位置元素,两两互换
第一种不用说,项目里用它就对了。第二种空间复杂度为O(n),实现简单。这里主要讨论后三种。
遍历互换
直接上代码:
void reverseString(vector<char>& s) {
// reverse(s.begin(), s.end());
int len = s.size();
char tmp;
for (int i = 0; i < len / 2; i++)
{
int j = len - i - 1;
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
}
思路很简单,对于替换两个元素,有个小技巧性的代码:
// swap a & b
a ^= b;
b ^= a;
a ^= b;
双指针
void reverseString(vector<char>& s) {
int l = 0;
int r = s.size() - 1;
while(l < r)
{
s[l] ^= s[r];
s[r] ^= s[l];
s[l] ^= s[r];
l++;
r--;
}
}
递归
void reverseStr(vector<char>& s, int start, int end) {
if (start > end)
return;
reverseStr(s, start + 1, end - 1);
swap(s[start], s[end]);
}
void reverseString(vector<char>& s) {
if (s.empty())
return;
reverseStr(s, 0, s.size() - 1);
}