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