C++卡码网题目55--右旋字符串

卡码网题目链接

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

输入示例
2
abcdefg
输出示例
fgabcde

思路:这道题最简单的做法是申请额外的空间,但这样就没有练习算法的意义了  我们增加点难度,不申请额外空间,只能在本串上操作,那么这道题的解法就和反转字符串中的单词

 类似了,使用整体反转+局部反转就可以实现反转单词顺序的目的。

这道题通过 整体倒叙,把两段子串顺序颠倒,两个段子串里的的字符在倒叙一把,负负得正,这样就不影响子串里面字符的顺序了。当然大家也可以尝试先局部反转后整体反转的做法,注意下反转区间即可。

代码如下:

#include
using namespace std;


void reverse1(string& s, int start, int end) {
    for (int i = start, j = end; i < j; i++, j--)
    {
        char tmp = s[j];
        s[j] = s[i];
        s[i] = tmp;
    }
}
int main()
{
    string str;
    int num;
    cin >> num;//获取右旋字符的个数
    cin >> str;//获取字符串
    reverse1(str, 0, str.size() - 1);//先把整个字符串反转过来
    reverse1(str, 0, num - 1);//再把右旋的部分字符串反转过来
    reverse1(str, num, str.size()-1);//最后把剩余字符反转过来,就实现了右旋字符串
    cout << str;
    return 0;
}

你可能感兴趣的:(c++,开发语言,算法)