翻轉吧!字符串!(字符串翻轉、左旋字符串)

題目1:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內部的順序不可改變。例如 I am a student. 翻轉後變爲 student. a am I 

 

經典解法:兩步翻轉,先整體翻轉,再以空格爲分隔,部分翻轉。所以需要一個翻轉函數。

翻轉函數:

void Reverse(string::iterator begin,string::iterator end)
    {
        if(begin == end)
            return ;
        while(begin<end)
        {
            char tmp = *begin;
            *begin = *end;
            *end = tmp;
            
            ++begin;
            --end;
        }
    }

 

 

兩步翻轉:

 

 

    
    string ReverseSentence(string str) {
        
        if(str.empty() || str.size() < 2)
            return str;
        
        Reverse(str.begin(),--str.end());
            
        string::iterator head = str.begin();
        string::iterator tail = str.begin();
        
        string::iterator end = str.end();
        while(head != end)
        {
            if(*head == ' ')
            {
                ++head;
                ++tail;
            }
            else if(*tail == ' ' || tail == end)
            {
                Reverse(head,--tail);
                head = ++ tail;
            }
            else
            {
                ++tail;
            }
        }
        return str;
    }

 

 

 

題目2:左旋字符串,就是把字符串前面若干個字符轉移到字符串的尾部。例如:abcdefg ,和數字2,左旋後變爲 cdefgab

解法:三步翻轉法,將字符串分爲兩部分 ab  cdefg ,先翻轉這兩部分,再整體翻轉。即ba gfedc  -> cdefgab

 

  string LeftRotateString(string str, int n) 
    {
        int size = str.size();
        if(size<2||n <= 0 || n>=size)
            return str;
        string::iterator it = str.begin();
        string::iterator begin = str.begin();
        string::iterator end = str.end();
        while(it < end)
        {
            if(it == (begin+n-1))
            {
                Reverse(begin,it);
                Reverse(++it,--end);
                Reverse(begin,end);
                break;
            }
            ++it;
        }
        
        return str;
    }

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章