題目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;
}