题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路:
1、翻转句子中的所有字符
2、翻转每个单词中字符的顺序
难点在于如何翻转每个单词中字符的顺序
这段代码用于确定每个单词的起始和终止位置:
b指向起始位置,e指向终止位置,b<str.size()
e++,直到单词终止位置的下一位置,这个位置要么为空字符,要么为str.size()的位置
找到单词终止位置e,进行单词翻转
并将b、e都指向单词终止位置的下一位置,判断是空格还是str.size()
如果是str.size(),说明没有单词可翻转了,如果是空格,则b++、e++,直到不是空格,到达下一单词的开头,e继续e++到达单词终止位置的下一位置
int b = 0, e = 0;
while(b < str.size()){
if(str[b] == ' '){
b++;
e++;
}
else if(str[e] == ' ' || e == str.size()){
Reverse(str, b, --e);
b = ++e;
}
else{
e++;
}
}
其他写法:
链接:https://www.nowcoder.com/questionTerminal/3194a4f4cf814f63919d0790578d51f3
来源:牛客网
int s = 0, e = 0;
int i = 0;
while(i < str.size())
{
while(i < str.size() && str[i] == ' ') //空格跳过
i++;
e = s = i; //记录单词的第一个字符的位置
while(i < str.size() && str[i] != ' ') //不是空格 找单词最后一个字符的位置
{
i++;
e++;
}
ReverseWord(str, s, e - 1); //局部翻转
}
class Solution {
public:
void Reverse(string &str, int b, int e){
while(b < e)
swap(str[b++], str[e--]);
}
string ReverseSentence(string str) {
Reverse(str, 0, str.size() - 1);
int b = 0, e = 0;
while(b < str.size()){
if(str[b] == ' '){
b++;
e++;
}
else if(str[e] == ' ' || e == str.size()){
Reverse(str, b, --e);
b = ++e;
}
else{
e++;
}
}
return str;
}
};