題目描述:
牛客最近來了一個新員工Fish,每天早晨總是會拿着一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
實現如下:
//這道題一開始理解錯了。。。→_→
//以爲是"student. a am I"轉"I am a student.",應該是剛好相反的。。。
//先將字符串整體反轉
//.tneduts a ma I
//再按照空格將字符串分割成不同的部分,依次反轉
//student. a am I
//注意:
//1.判斷輸入字符串是否有效
//2.有可能輸入的字符串中沒有空格
class Solution
{
public:
void Reserve(string &str, int beginIndex, int endIndex)
{
char tmp;
for (; beginIndex < endIndex; ++beginIndex, --endIndex)
{
tmp = str[beginIndex];
str[beginIndex] = str[endIndex];
str[endIndex] = tmp;
}
}
string ReverseSentence(string str)
{
if (str.empty())/防禦性動作,判斷str是否有效
return str;
Reserve(str, 0, str.size() - 1);//先將整個字符串反轉
int beginIndex = 0;//記錄需要反轉部分的起始下標
int endIndex = 0;//記錄需要反轉部分的終止下標
while (str[beginIndex] != '\0')
{
if (str[beginIndex] == ' ')//有可能是連續的空格,直接略過
{
++beginIndex;//起始和終止下標一起後移
++endIndex;
}
else if (str[endIndex] == ' ' || str[endIndex] == '\0')//當終止下標所對應的元素爲空格或'\0'時
{
Reserve(str,beginIndex, --endIndex);//反轉這個部分
beginIndex = ++endIndex;//反轉之後,起始和終止下標統一
}
else//否則繼續後移終止下標,繼續尋找直到空格或'\0'
++endIndex;
}
return str;
}
};