題目:把字符串前面n個字符串轉移到字符串的尾部。如“abcdefg”左移2位後變爲“cdefgab”。
思路:以“abcdefg”左移2位後變爲“cdefgab”爲例,可以先把字符串分爲兩部分,前面2個字符”ab”爲一部分,內部進行反轉,得到”ba”;再把剩餘部分字符進行反轉,得到”gfedc”;最終將整個字符串進行反轉,得到”cdefgab”。
代碼如下,
/*字符串反轉*/
string ReverseString(string &str, int begin, int end)
{
char temp;//臨時輔助變量
while(begin < end)//從兩端向中間成對反轉字符
{
temp = str[begin];
str[begin] = str[end];
str[end] = temp;
begin++, end--;
}
return str;
}
/*左移字符串*/
string LeftRotateString(string str, int n)
{
string result;
if(str.size() == 0 || n < 0)//若輸人空串或左移小於0位,則返回空串
return result;
if(n % str.size() == 0 || n == 0)//若左移位數是字符串長度的整數倍或左移0位,則返回原字符串
return str;
result = ReverseString(str, 0, n - 1);//反轉前半部分字符串
result = ReverseString(str, n, str.size() - 1);//反轉後半部分字符串
result = ReverseString(str, 0, str.size() - 1);//反轉整個字符串
return result;
}
擴展:字符串內單詞順序反轉,單詞不反轉。如,將“I am a student.”變成“student. a am I”。
思路:以將“I am a student.”變成“student. a am I”爲例,可以想到先把整個字符串反轉,得到”.tneduts a ma I”,然後再將單詞內部反轉,即可得到“student. a am I”。其中,將”.”作字母處理。
代碼如下,
/*字符串反轉*/
string ReverseString(string &str, int begin, int end)
{
char temp;//臨時輔助變量
while(begin < end)//從兩端向中間成對反轉字符
{
temp = str[begin];
str[begin] = str[end];
str[end] = temp;
begin++, end--;
}
return str;
}
/*英文語句反轉*/
string ReverseSentence(string str)
{
string result;
if(str.size() == 0)//若輸人空串,則返回空串
return result;
result = ReverseString(str, 0, str.size() - 1);//將整個語句反轉
int i = 0, j = 0;//設置單詞反轉的始末標誌位,i爲開始位置,j爲結束位置
while(j < str.size())
{
while(str[i] == ' ' && i < str.size())//若反轉後字符串開始位置爲空格,則跳過空格部分
i++;
j = i;//語句中某個單詞開始的位置
while(str[j] != ' ' && j < str.size())//語句中某個單詞結束的位置
j++;
result = ReverseString(str, i, j - 1);//單詞內部反轉
i = j + 1;//語句中下一個單詞開始的位置
}
return result;
}