还记得上学时每周要换座位吗?第四组换到第一组、第一组换到第二组…… 现在用一个字母表示一个组,请你计算经历n周之后座位的情况。 输入描述: 输入有多组数据,每组数据一行。每行包括一个字符串s和整数n1. s只有相互不同的字母构成。2. 如果n是正整数,字符串向右移动;否则向左移动。 输出描述: 对应每一组输入,输出调整之后的座位情况。 输入例子: ABCD 2ABCD -1 输出例子: CDABBCDA
思路:移位的次数如果是小组个数的整数倍,即n是字符串长度的整数倍时,那么字符串原顺序不变。因此,处理时只处理n %
(s.length())次移动。
处理如下:
首先判断n的值:
1、n == 0 或者 n % s.length() == 0 或者 s.length() ==
0时,直接返回,输出源字符串即可;
2、除了1的情况,只有n > 0和n < 0两种情况,分别处理如下:
1)n > 0时,例如ABCD,n =
2,此时第一次移动可以看做A的前面插入一个D,然后删掉字符串尾的D,变为DABC;第2次移动看做D的前面插入一个C,然后将字符串尾的C删除,变为CDAB。因此最后结果为CDAB-->总结来看,移动n次,即相当于移动n
= n % s.length()次,也就是将字符串的后n个字符依次插入到字符串的首位置,再删除后n个字符。
2)n < 0时,例如ABCD,n =
-2,此时第一次移动可以看做D的后面插入一个A,然后删掉字符串头的A,变为BCDA;第二次移动看做A的后面插入一个B,然后删除字符串头的B,变为CDAB,因此最后结果为CDAB-->总结开看,移动n次,即相当于移动n
= n % s.length()次,也就是将字符串的前n个字符一次插入到字符串的尾位置之后,再删除前n个字符。
代码如下所示:
// write your code here cpp #include
#include
void change(string& s, int n) { int len =
s.length(); if(len == 0 || n == 0 || abs(n) % len == 0)
return; int x = n % len; if(n < 0)
{ while(x ++) {
s.insert(s.length(), 1, s[0]); s.erase(s.begin() -
1); } } else {
while(x --) { s.insert(0, 1,
s[s.length()- 1]); s.erase(s.end() - 1);
} } } int main() { string s;
int n; while(cin >> s >> n) {
change(s, n); cout << s << endl;
} }