題目要求:
給定一個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;
}