劍指Offer——(44)翻轉單詞順序列

題目描述:

牛客最近來了一個新員工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;
    }
};
發佈了107 篇原創文章 · 獲贊 36 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章