NowCode:HJ13 句子逆序

题目: 句子逆序

描述

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”

所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

数据范围:输入的字符串长度满足 1≤𝑛≤1000

输入描述:

输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。

输出描述:

得到逆序的句子

示例1

1
2
3
4
5
输入:
I am a boy

输出:
boy a am I

示例2

1
2
3
4
5
输入:
nowcoder

输出:
nowcoder

题解

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
#include <iostream>
#include <vector>
using namespace std;

int main() {
string input;
getline(cin, input);
input += ' ';
int size = input.size();
int begin = 0;
int len = 0;
vector<string> vec;
for (int i = 0; i < size; i++) {
if (input[i] == ' ') {
len = i - begin;
vec.push_back(input.substr(begin, len));
begin = i;
}
}
cout << vec[vec.size() - 1].substr(1);
for (auto it = vec.rbegin() + 1; it != vec.rend() - 1; it++) {
cout << *it;
}
cout << " " << vec[0];
}

思路

利用空格分隔单词,通过i - begin得到单词长度。首尾由于空格和中间有区别,故特殊处理

此题挺好

string::substr用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// string::substr
#include <iostream>
#include <string>

int main ()
{
std::string str="We think in generalities, but we live in details.";
// (quoting Alfred N. Whitehead)

std::string str2 = str.substr (3,5); // "think"

std::size_t pos = str.find("live"); // position of "live" in str

std::string str3 = str.substr (pos); // get from "live" to the end

std::cout << str2 << ' ' << str3 << '\n';

return 0;
}

Output:

1
think live in details.