VIRTUALS

the virtual labs for the virtuals

0%

HJ13. 句子逆序

摘要:
简单栈的应用。

题目

描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

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

输出描述:
得到逆序的句子

示例1

输入:
I am a boy

输出:
boy a am I

注意Java语言中,StringBuilder 的清空有三种常见的方式。
StringBuilder sb = new StringBuilder();

    1. sb.setLength(0);
    1. sb.delete(0. sb.length());
    1. 生成新的StringBuilder对象,旧的由GC回收。

三种方法最快的是第一种,第二种次之(差别很小),最慢的是第三种。
另外注意第二种方式,第二个index指向 StringBuilder 最后一个字符下标的后一位。

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
/*
* author: etoa
* 2021年08月18日22:20:41
*/
#include <bits/stdc++.h>

using namespace std;

stack<string> stk;

int main()
{
string s;
getline(cin, s);
s += ' ';
string tmp = "";
for (int i = 0, n = s.size(); i < n; i ++) {
if (s[i] == ' ') {
stk.push(tmp);
tmp = "";
} else {
tmp += s[i];
}
}
for (; !stk.empty(); stk.pop()) {
cout << stk.top() << " ";
}
return 0;
}
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
/*
* author: etoa
* 2021-08-18 22:34:00
*/
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
s += " ";
LinkedList<String> stk = new LinkedList<>();
char[] chs = s.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0, n = s.length(); i < n; i++) {
if (chs[i] == ' ') {
stk.addLast(sb.toString());
sb.setLength(0);
} else {
sb.append(chs[i]);
}
}
for (; !stk.isEmpty();) {
System.out.print(stk.removeLast() + " ");
}
}
}

原题链接: HJ13. 句子逆序