1、反转字符串中的单词
思路: 整个字符串反转、移除多余的空格、再将单词反转
class Solution {
public:
void reverse (string &s,int start, int end)
{
for(int i = start , j = end; i < j; i++, j--)
{
swap(s[i], s[j]);
}
}
void removeExtraSpace(string &s)
{
int slow = 0;
for(int i = 0;i < s.size(); ++i)
{
if(s[i] != ' ')
{
if(slow != 0) s[slow++] = ' ';
while(i<s.size() && s[i] != ' ')
{
s[slow++] = s[i++];
}
}
}
s.resize(slow);
}
string reverseWords(string s)
{
removeExtraSpace(s);
reverse(s,0,s.size() - 1);
int start = 0;
for(int i = 0; i <= s.size(); ++i)
{
if (i == s.size() || s[i] == ' ')
{
reverse(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
reverse(s,0,s.size() - 1);:
这一行调用了一个未在代码段中定义的函数reverse,它用于反转字符串s中从索引0到s.size() - 1(即整个字符串)的字符顺序。
2、右旋转字符串
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
int len = s.size(); //获取长度
reverse(s.begin(), s.begin() + len - n); // 先反转前一段,长度len-n ,注意这里是和版本一的区别
reverse(s.begin() + len - n, s.end()); // 再反转后一段
reverse(s.begin(), s.end()); // 整体反转
cout << s << endl;
}