题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路:
微软实习面试一面算法题,简单描述就是翻转字符串,但保证其中单词顺序不变。
采用的方法是,先将字符串整个翻转,再将其中单词一一翻转一遍,即可实现目标。识别单词是空格起始和空格结束。这里翻转字符串的函数与左旋转字符串中使用的一样。
思路很直接,但是有一些要注意的细节。还有“”表示空字符串,“”不等于NULL,“”会创建一个对象,占内存空间,NULL不占内存空间。‘ ’表示空格,必须是单引号,里面必须打一个空格。因为单引号表示字符,双引号表示字符串。
参考代码:
在线测试
AC代码
class Solution {
public:
string ReverseSentence(string str) {
if(str.size()<=0)
return "";
reverse(str, 0, str.size()-1);
for (int i=0;i<str.size();i++)
{
if(str[i]!=' ')//碰到非空格表示开始单词了
{
int begin=i;//记录下单词起始位置
i++;
while(i<str.size()&&str[i]!=' ')//注意这里必须要确保i<str.size(),因为上一步增加了i;直到碰到空格,说明单词结束了
{
i++;
}
reverse(str,begin,i-1);//单词的结束位置是i-1,第i位是空格,肯定不满足上面的if条件,所以直接i++判断下一个位置
}
}
return str;
}
void reverse(string &str, int begin, int end)
{
if(begin>=end)
return;
int i=begin;
int j=end;
while(i<j)
{
swap(str[i],str[j]);
i++;
j--;
}
}
};