经典指数          
原因
2113
浏览数
0
收藏数
 

还记得上学时每周要换座位吗?第四组换到第一组、第一组换到第二组…… 现在用一个字母表示一个组,请你计算经历n周之后座位的情况。 输入描述: 输入有多组数据,每组数据一行。每行包括一个字符串s和整数n1. s只有相互不同的字母构成。2. 如果n是正整数,字符串向右移动;否则向左移动。 输出描述: 对应每一组输入,输出调整之后的座位情况。 输入例子: ABCD 2ABCD -1 输出例子: CDABBCDA

     举报   纠错  
 
切换
1 个答案

思路:移位的次数如果是小组个数的整数倍,即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 using namespace std;

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;

    } }

 
切换
撰写答案