代码改变世界

面试题3:字符串的旋转

2016-03-21 20:38  Keiven_LY  阅读(334)  评论(0编辑  收藏  举报

题目描述

给定一个字符串,要求将字符串前面的若干字符移到字符串的尾部。比如:将字符串“abcdef”的前3个字符’a’,’b’,’c’移到字符串的尾部,则原字符串将变为“defabc”。请写一个函数来实现此功能。

方法一:蛮力移位

基本思想:将需要移动的字符一个一个移动到字符串的尾部。

假设字符串s的长度为n,可以先实现一个函数移动字符串第1个字符到字符串的尾部,如果要移动前m个字符到字符串的尾部,可以调用m次上述函数即可。

void LeftShiftOne(char *s, int n)
{
    char t = s[0]; //将字符串的第一个字符保存下来
    //将字符串除第一个字符外的字符向前移动一位
    for(int i=1;i<n;i++)
        s[i-1] = s[i];
    
    s[n-1] = t; //将第一个字符放在字符串的最后一位
}

void LeftShiftM(char *s, int n, int m)
{
    while(m>0)
    {
        LeftShiftOne(s,n);
        m--;
    }
}

方法二:三步反转

基本思想:

  1. 先将原字符串截成两部分X和Y,比如将“abcdef”截成X=“abc”,Y=“def”两部分;
  2. 再分别将X和Y的所有字符反转,即Xàcba,Yàfed;
  3. 最后将上述结果整体反转,即cbafedàdefabc。
void swapstring(char *s, int from, int to)
{
    while(from < to)
    {
        char t = s[from];
        s[from] = s[to];
        s[to] = t;    
        from++;
        to--;
    }
}

void LeftShiftM(char *s, int n, int m)
{
    m %= n;  //考虑移动大于n位时,则与%n是等价的
    swapstring(s, 0, m-1); //X部分反转
    swapstring(s, m, n-1); //Y部分反转
    swapstring(s, 0, n-1); //整体反转    
}