編程之法1.1字符串的旋轉

題目要求:

  給定一個n位字符串,要求將字符串前面的m個字符移到字符串尾部。

解法一:暴力移位法

  也就是要移多少位就一位一位地移。
  時間複雜度O(mn),空間複雜度O(1)。

void ShiftOne(char *text,int n)//移動一個字符
{
    char t=text[0];
    for(int i=1;i<n;i++)
    {
        text[i-1]=text[i];
    }
    text[n-1]=t;
}
void ShiftAll(char *text,int n,int m)//逐次移動
{
    while(m--)
    {
        ShiftOne(text,n);
    }
}

解法二:三位反轉法

  以要移位的地方爲分界線,將字符串0~m位反轉,將m~(n-1)位反轉,再將0~(n-1)位反轉,經過三次反轉之後可以得到後移m位的結果。
  時間複雜度O(n),空間複雜度O(1)。

void ShiftOneText(char *text,int first,int last)//反轉一個字符串
{
    while(first<last)
    {
        char t=text[first];
        text[first++]=text[last];
        text[last--]=t;
    }
}
void ShiftAllText(char *text,int n,int m)//反轉全過程
{
    m=m%n;//如果text17位,那移動20位和移動3位是一樣的
    ShiftOneText(text,0,m-1);
    ShiftOneText(text,m,n-1);
    ShiftOneText(text,0,n-1);

}

擴展

題目要求:

  輸入一個英文句子,翻轉句子中單詞的順序。要求單詞內字符的順序不變,句子中單詞以空格符隔開。
  爲簡單起見,標點符號和普通字母一樣處理。例如輸入"I am a student.",則輸出"student. a am I"。
  解法:以空格爲單位將字符串逐塊反轉,然後再整體反轉。比如原字符串爲"This is my pen.",以空格反轉之後是"sihT si ym .nep",再將整體反轉就得到"pen. my is This"。

string ReverseSentence(string text)
{
    int i=0,j=0;
    string str=text;
    while(j<str.length())
    {
        if(str[j]==' ' || j==str.length()-1)
        {
            int m=i,n=j-1;
            if(str[j]!=' ')
                n=j;
            while(m<n)
            {
                char t=str[m];
                str[m++]=str[n];
                str[n--]=t;
            }
            i=j+1;
        }
        j++;
    }
    i=0;
    j=str.length()-1;
    while(i<j)
    {
        char t=str[i];
        str[i++]=str[j];
        str[j--]=t;
    }
    return str;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章