1. 程式人生 > >劍指offer 面試題42:左旋轉字串vs翻轉單詞順序 c++

劍指offer 面試題42:左旋轉字串vs翻轉單詞順序 c++

題目:組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出迴圈左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!

思路:通過旋轉, 比如題目中S=”abcXYZdef”,第一次全部旋轉S="fedZYXcba",第二次 旋轉0至length-3為S="XYZdefcba",第三次旋轉length-2至length為S="XYZdefabc"

class Solution {
public:
    void reverse(string &str,int a,int b)
    {
        char c;
        while(a<=b)
        {
            c=str[a];
            str[a]=str[b];
            str[b]=c;
            a++,b--;
        }
    }
    string LeftRotateString(string str, int n) {
        if(str.empty() || n==0) return str;
        int len=str.length()-1;
        reverse(str,0,len);
        reverse(str,0,len-n);
        reverse(str,len-n+1,len);
        return str;
    }
};

題目:(翻轉單詞順序列)牛客最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?

思路:還是基於 翻轉,先全部翻轉一次,然後碰到空格即為每個單詞,翻轉一次。可以自己寫函式,也可以用stl的reverse函式

class Solution {
public:
    void reverse(string &str,int a,int b)
    {
        char c;
        while(a<=b)
        {
            c=str[a];
            str[a]=str[b];
            str[b]=c;
            a++,b--;
        }
    }
    string ReverseSentence(string str) {
        if(str.empty())return str;
        int start=0,len=str.length()-1;
        reverse(str,start,len);
        for(int i=0;i<=len;++i)
        {
            if(str[i]==' ')
            {
                reverse(str,start,i-1);
                start=i+1;
            }
            if(i==len)
                reverse(str,start,len);
        }
        return str;
    }
};

用stl的reverse函式

string ReverseSentence(string str) {
	int size = str.size();
	reverse(str.begin(), str.end()); // 注意:翻轉後的第一個字元是空格
	int start = 0;
	for (int i = 0; i < size; ++i)
	{
		if (str[i] == ' ')
		{
			reverse(str.begin() + start, str.begin() + i);
			start = i + 1; // 每個單詞的第一個下標
		}
		if (i == size - 1)  // 翻轉最後一個單詞
			reverse(str.begin() + start, str.end());
	}
	return str;
}