151.翻转字符串里的单词
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;
int fast = 0;
for (; fast < s.size(); fast++) {
if (s[fast] != ' ') {
if (slow != 0) {
s[slow++] = ' ';
}
while (fast < s.size() && s[fast] != ' ') {
s[slow++] = s[fast++];
}
}
}
s.resize(slow); // 更新size
}
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;
}
};
卡码网:55.右旋转字符串
reverse()函数是C++的一个新增函数,使用需要包含头文件#include <algorithm>
reverse函数用于反转在[first,last)范围内的顺序,reverse函数没有返回值。
#include<iostream>
using namespace std;
#include<algorithm>
int main(){
string s;
int k = 0;
cin >> k;
cin >> s;
//先整体翻转,再局部翻转即可得到目标字符串
reverse(s.begin(),s.end());
reverse(s.begin(),s.begin()+k);
reverse(s.begin()+k,s.end());
cout << s << endl;
}