题目描述

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

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

测试样例:
"ABCDEFGH",8,4
返回:"FGHABCDE"


问题简化:假设现在只要把E放在左边,那么我们可以先用一个变量记录E,然后把整个字符串向右移动一位,第一个空出来的位置用变量填充,即达到效果。
那么现在的问题,就是把p到n-1的字符放在串首,还是和上面一样道理,只是加一个外循环,看需要向右移动几次。代码如下:
class StringRotation {
public:
    string rotateString(string A, int n, int p) {
        // write code here
        char ch;
        for(int i=0;i<n-p-1;i++) {
            ch=A[n-1];
            for(int j=n-1;j>=1;j--) {
                A[j]=A[j-1];
            }
            A[0]=ch;
        }
        return A;
    }
};

思路:题目的意思是把后部分的字符串都转移到原字符串的串首。那么首先需要计算有多少个字符需要转移。用一个外循环,n-1-p即为后部分的字符数(所需要转移字符);另外设一个字符ch用来记录最后一个字符,然后开始用一个内循环,每次删除最后一个字母,直到删除到0处,把ch记录的字符放在下标为0处;

 

通过查阅资料,发现一些简单方法.

第一次两部分分别reverse 。
第二次整体reverse。
string rotateString(string A, int n, int p) {
    // write code here
    //剑指offer上的题目,两次翻转
     
    //先进行局部翻转
    int i = 0, j = p;
    while(i < j)
        swap(A[i++], A[j--]);
     
    i = p + 1, j = n - 1; 
    while(i < j)
        swap(A[i++], A[j--]); 
     
    //再整体翻转
    i= 0, j = n - 1;
    while(i < j)
        swap(A[i++], A[j--]);
     
    return A;
     
}

 // 如果调用reverse函数,看起来更简单。。。 

string rotateString(string A, int n, int p) {
    // write code here
    //剑指offer上的题目,两次翻转
     
    //先进行局部翻转
    reverse(A.begin(), A.begin()+p+1); //vector的迭代器支持 + 
    reverse(A.begin()+p+1, A.end());
    //再整体翻转
    reverse(A.begin(), A.end());
     
    return A;
     
}

 

拼接两个字符串,从中间截取源字符串长度,就得到了旋转字符串
classStringRotation {
 
public:
 
    string rotateString(string A, intn, intp) {
 
        // write code here
 
        return(A+A).substr(p+1,n);
 
    }
 
};

 

posted on 2017-07-25 21:44  王小东大将军  阅读(380)  评论(0编辑  收藏  举报