zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

翻转单词顺序


题目描述

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

解题思路

一开始,我认为给定的句子,是杂乱的没有什么规律的排序。后来才知道,给的字符串中句子,就是单词前后翻转的。是我想复杂了😂

仔细观察就会发现,先将每个单词翻转,然后就是将整个字符串翻转就能得到正确结果。

其中关键,就是怎样将每个单词翻转。当然是根据每个单词直间的空格 来做区分啦

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution
{
public:
string ReverseSentence(string str)
{
string result = str;
int length = result.size();
if (length == 0)
return "";

result += ' '; // 因为最后一个单词没有空格,故认为添加
int mark = 0; // 设置一个下一个单词的起始位置
// 遍历整个字符串,对每个单词翻转
for (int i = 0; i < length + 1; i++) // 这里字符串的长度由于添加了一个空格字符,长度增加一
{
if (result[i] == ' ') // 注意这是 ' '(表示字符),而不是 " "(表示字符串)
{
Reverse(result, mark, i - 1);
mark = i + 1;
}
}

result = result.substr(0,length); // 通过复制操作,通过控制复制字符的长度和起始位置,去点添加的空格字符
// 翻转形成的新字符串
Reverse(result, 0, length - 1);
return result;
}

// 翻转函数
void Reverse(string &str, int begin, int end)
{
while (begin < end)
swap(str[begin++], str[end--]);
}
};

参考博文链接:https://cuijiahua.com/blog/2018/01/basis_44.html

文章作者:zerofly

发布时间:2020年06月01日 - 11:06

原始链接:http://zeroflycui.github.io/3ad2c455.html

许可协议: 转载请保留原文链接及作者。