对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。

给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。

测试样例:

"ABCDEFGH",8,4

返回:"FGHABCDE"

 

方法一:利用特殊函数直接旋转法

 

解析一:根据题意,将一个字符串的某个位置的左侧移动到右侧,右侧移动到左侧,由此我们通过使用substr函数,即将一个字符串从一个指定位置开始,并具有指定长度的子字符串复制,从而得到我们最终旋转得到的字符串。

 

代码:

#include<iostream>

#include<string>

using namespace std;



string revolve(string s,int n,int p)

{

       if(p==n-1)

              return s;

      

       string ss;

       ss=s.substr(p+1)+s.substr(0,p+1);//substr从一个字符串复制一个从指定位置开始,并具有指定长度的子字符串

       return ss; 

}



int main()

{

       string s;

       int n,p;

       cin>>s>>n>>p;

       cout<<revolve(s,n,p)<<endl;

       return 0;

}

解析二:根据题意,将一个字符串的某个位置的左侧移动到右侧,右侧移动到左侧,由此我们可以先定义一个字符串存储2倍的原字符串,再利用substr特殊函数得到所要求解的新字符串。

 

代码:

#include<iostream>

#include<string>

using namespace std;



string revolve(string A,int n,int p)

{

       string s=A+A;

       string ss=s.substr(p+1,n);

       return ss;

}



int main()

{

       string s;

       int n,p;

       cin>>s>>n>>p;

       cout<<revolve(s,n,p)<<endl;

       return 0;

}

方法二:利用特殊函数翻转法

 

解析:根据题意,将一个字符串的某个位置的左侧移动到右侧,右侧移动到左侧,由此我们通过使用reserve函数,即将一个字符串中最后一个字符放置到另一个字符串的第一个字符位置、倒数第二个字符放置在另一个字符串的第二个字符位置,以此类推,在使用时需添加#include<algorithm>头文件,从而首先将字符串整体翻转,再将其部分进行翻转得到最终的结果。

 

代码:

#include<iostream>

#include<string>

#include<algorithm>

using namespace std;



string revolve(string s,int n,int p)

{

       reverse(s.begin(),s.end());//reverse()函数将一个字符串中最后一个字符放置到另一个字符串的第一个字符位置、倒数第二个字符放置在另一个字符串的第二个字符位置,以此类推

       reverse(s.begin(),s.begin()+n-p-1);

       reverse(s.begin()+n-p-1,s.end());

       return s;

}



int main()

{

       string s;

       int n,p;

       cin>>s>>n>>p;

       cout<<revolve(s,n,p)<<endl;

       return 0;

}

 

方法三:暴力法

 

解析:根据题意,将一个字符串的某个位置的左侧移动到右侧,右侧移动到左侧,由此我们先定义一个行的字符串,然后使用for语句将指定位置右侧的字符循环存入新的字符串中,再用for语句将指定位置左侧的字符循环继续存入新的字符串中,由此可以得到旋转后的字符串。

 

代码:

#include<iostream>

#include<string>

using namespace std;



string revolve(string A,int n,int p)

{

       string s;

       for(int i=p+1;i<n;i++)

              s += A[i];

       for(int i=0;i<p+1;i++)

              s += A[i];

       return s;

}



int main()

{

       string s;

       int n,p;

       cin>>s>>n>>p;

       cout<<revolve(s,n,p)<<endl;

       return 0;

}

方法四:移动旋转法

 

解析:根据题意,将一个字符串的某个位置的左侧移动到右侧,右侧移动到左侧,由此我们先利用for语句将指定位置左侧的字符倒序,再利用for语句将指定位置右侧的字符倒序,最后利用for语句,使用位运算符通过交换的方法得到最终的字符串。

 

代码:

#include<iostream>

#include<string>

using namespace std;



string revolve(string A,int n,int p)

{

       int i;

    string res = A;    for(i = 0; i

<= p; i++)

    {

              res[i] = A[p - i];

              cout<<res[i];

       }

       cout<<endl;  

    for(; i < n; i++)

    {

              res[i] = A[n - i + p];

              //cout<<res[i];

       }

       //cout<<endl;

    for(i = 0; i < (n >> 1); i++)//i>>1表示i右移1位

       {

        char tmp = res[i];

        res[i] = res[n - i - 1];

        res[n - i - 1] = tmp;

        //cout<<res[i];

    }

    //cout<<endl;

    return res;

}



int main()

{

       string s;

       int n,p;

       cin>>s>>n>>p;

       cout<<revolve(s,n,p)<<endl;

       return 0;

}

方法五:利用特殊函数旋转法

 

解释:根据题意,将一个字符串的某个位置的左侧移动到右侧,右侧移动到左侧,由此我们通过添加头文件#include<algorithm>,利用rotate(beg,newBeg,end)函数将区间[beg,end)内的元素进行旋转,从而得到所要求解的字符串。

 

代码:

#include<iostream>

#include<algorithm>

using namespace std;



string revolve(string A,int n,int p)

{

       rotate(A.begin(),A.begin()+p+1,A.end());//rotate(beg,newBeg,end)将区间[beg,end)内的元素进行旋转,执行后*newBeg成为新的第一元素

       return A;

}



int main()

{

       string s;

       int n,p;

       cin>>s>>n>>p;

       cout<<revolve(s,n,p)<<endl;

       return 0;

}

 

更多推荐

字符串的旋转