字符串循环左移

输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入格式: 输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。

输出格式: 在一行中输出循环左移N次后的字符串。

输入样例:

1
2
Hello World!
2

输出样例:

1
llo World!He

编程珠玑第二章有个「机智」的解法,那就是翻手算法,这个算法在时间和空间上都十分高效,而且实现代码也非常简单,三次reverse就可以了

机智解法代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <algorithm>

using namespace std;

int main(void)
{
    string s;
    int i;
    getline(cin, s);
    cin >> i;
    string::iterator it = s.begin()+i;
    reverse(s.begin(), it);
    reverse(it, s.end());
    reverse(s.begin(), s.end());
    cout << s << endl;
    return 0;
}

当然,C++的<algorithm>已经有一个rotate函数了,据说实现也是相当快 直接用就是了~

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>

using namespace std;

int main(void)
{
    string s;
    int i;
    getline(cin, s);
    cin >> i;
    rotate(s.begin(), s.begin()+i, s.end());
    cout << s << endl;
    return 0;
}