左旋:左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
1.
#include <iostream>
#include <string>
using namespace std;
string righttrans(int k, string s){
int n = s.length();
string res(n, ' ');
if(k > n) k %= n;
for(int i = 0; i < k; i++){
res[n - k + i] = s[i];
}
for(int i = 0; i < n - k; i++){
res[i] = s[k + i];
}
return res;
}
int main(){
int k;
cin >> k;
string s;
cin >> s;
string res = righttrans(k, s);
cout << res << endl;
return 0;
}
右旋:将后面k个元素移至最前
#include <iostream>
#include <string>
using namespace std;
string righttrans(int k, string s){
int n = s.length();
string res(n, ' ');
if(k > n) k %= n;
for(int i = 0; i < k; i++){
res[i] = s[n - k + i];
}
for(int i = 0; i < n - k; i++){
res[k + i] = s[i];
}
return res;
}
int main(){
int k;
cin >> k;
string s;
cin >> s;
string res = righttrans(k, s);
cout << res << endl;
return 0;
}
2.不能申请额外空间,只能在本串上操作:使用整体反转+局部反转
#include <iostream>
#include <string>
using namespace std;
void reverse(string& s, int begin, int end){
for(begin, end; begin < end; begin++, end--){
swap(s[begin], s[end]);
}
}
void righttrans(int k, string& s){
int n = s.size();
reverse(s, 0, n-1);
reverse(s, 0, k-1);
reverse(s, k, n-1);
}
int main(){
int k;
cin >> k;
string s;
cin >> s;
righttrans(k, s);
cout << s << endl;
return 0;
}