劍指offer 面試題58 翻轉字符串

問題1:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。爲簡單起見,標點符號和普通字母一樣處理。例如輸入字符串"I am a student. ",則輸出"student. a am I"。

思路:翻轉整個句子,然後翻轉每個單詞。

代碼:

class Solution {
public:
    string ReverseSentence(string str) {
        if(str.empty())
            return str;
        reverse(str.begin(),str.end());
        string::iterator iter1=str.begin();
        string::iterator iter2=str.begin();
        while(iter1!=str.end())
        {
            if(*iter1==' ')
            {
                iter1++;
                iter2++;
            }
            else if(*iter2==' ')
            {
                // why not reverse(iter1,--iter2);  Because range is [first,last).
                reverse(iter1,iter2);
                iter1=++iter2;
            }
            else if(iter2==str.end())
            {
                reverse(iter1,iter2);
                break;
            }
            else
            {
                iter2++;
            }
        }
        return str;
    }
};

複雜度分析:時間複雜度爲O(n),空間複雜度爲O(1)。


問題2:字符串的左旋轉操作是把字符串前面的若干個字符轉移到字符串的尾部。請定義一個函數實現字符串左旋轉操作的功能。比如,輸入字符串"abcdefg"和數字2,該函數將返回左旋轉兩位得到的結果"cdefgab"。

思路:基於上述問題的解決方法(翻轉字符串)

首先,將字符串分爲兩部分,然後,兩部分分別進行翻轉,最後,將整個字符串進行翻轉。

複雜度分析:時間複雜度爲O(n),空間複雜度爲O(1)。

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