题目(卡码网 T55):
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
方法:本题和昨天的反转字符串的单词有相似之处,不过昨天是反转一个以空格为分界,多个单词的字符串,而本体是一个完整的字符串没有空格相隔,且旋转的位数是自定义的。但两者大致的思想都是按固定位置旋转一个字符串。因此我们可以借鉴思想,先将一整个字符串进行反转,然后再按照给定的反转位进行两次反转,就可以得到需要的字符串了。比如abcdefg的字符串先进行完全反转变为gfedcba,反转位是2且是右旋转,我们就可以将前两位和剩下的len-2位分别进行反转,就得到了fgabcde。大功告成!
题解:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
string s;
cin>>n;
cin>>s;
int length = s.size(); //获得字符串的长度
reverse(s.begin(),s.end()); //完全翻转字符串
reverse(s.begin(),s.begin() + n); //翻转前n位字符串
reverse(s.begin() + n,s.end()); //翻转后len-n位字符串
cout<<s<<endl;
}