55. 右旋字符串(第八期模拟笔试) (kamacoder.com)
简单想的话需要开辟新的空间,少开辟一点开一个vector存后面的字符,然后双指针往后移动前面的字符,最后前面的字符被赋值为vector中的存储。
#include<iostream>
#include<vector>
using namespace std;
int main(){
int num;
string s;
cin>>num;
cin>>s;
int i = s.size()-num;
vector<char>extra(i);
int j = 0;
for(;i<s.size();i++){
extra[j] = s[i];
j++;
}
for(i = s.size()-1;i>=num;i--){
s[i] = s[i-num];
}
for(i = 0;i<num;i++){
s[i] = extra[i];
}
cout<<s<<endl;
return 0;
}
进阶版:
不需要额外空间
reverse(s.begin(), s.end()); // 整体反转
reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
reverse(s.begin() + n, s.end()); // 再反转后一段
若题目为左反转:
reverse(s.begin(), s.begin() + n); // 反转第一段长度为n
reverse(s.begin() + n, s.end()); // 反转第二段长度为len-n
reverse(s.begin(), s.end()); // 整体反转