题目信息
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
示例输入:i2am@a student
示例输出:student a am i
编码
方法一,使用缓冲字符存单词,并对单词做逆序处理输出
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReverseWords {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
// 输入非空且有实际内容值时进入循环
while ((input = br.readLine()) != null && input.trim().length() > 0) {
// 将输入内容转为字符数组
char[] chArr = input.toCharArray();
StringBuilder sb = new StringBuilder();
// 定义长度,标识连续有效单词字符长度
int mark = 0;
// 定义flag,为true标识为一个单词的连续字符
boolean flag = false;
for (int i=0; i<chArr.length; i++) {
// 若为有效字符,则flag置true,mark加1
if (Character.isLowerCase(chArr[i]) || Character.isUpperCase(chArr[i])) {
mark++;
flag = true;
// 若字符不为有效字符,且连续标识flag为true时,将之前有效字符输出
} else if (flag){
sb.append(chArr, i-mark, mark).append(" ");
mark = 0;
flag = false;
}
}
// 最后一个字符为单词字符场景,flag为true
if (flag) {
// 将有效的字符拼接
sb.append(chArr, chArr.length-mark, mark);
// 最后一个字符为非单词字符,此时flag为false,则之前缓冲字符最终符号为空格
} else {
// 去除最后一个空格
sb.toString().trim();
}
// 将拼接单词的缓冲字符串按照空格分隔为有效单词
String[] wordArr = sb.toString().split(" ");
sb = new StringBuilder();
// 单词逆序
for (int i=wordArr.length-1; i>=0; i--) {
sb.append(wordArr[i]).append(' ');
}
System.out.println(sb.substring(0, sb.length()-1));
}
}
}
方法二,利用栈先进后出原理,让单词先进后出,避免对单词做逆序处理
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;
public class ReverseWords {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input;
// 输入非空且有实际内容值时进入循环
while ((input = br.readLine()) != null && input.trim().length() > 0) {
// 将输入内容转为字符数组
char[] chArr = input.toCharArray();
// 定义长度,标识连续有效单词字符长度
int mark = 0;
// 定义flag,为true标识为一个单词的连续字符
boolean flag = false;
// 定义栈,利用栈先进后出的作用,最后输出单词
Deque<String> list = new LinkedList<>();
for (int i=0; i<chArr.length; i++) {
// 若为有效字符,则flag置true,mark加1
if (Character.isLowerCase(chArr[i]) || Character.isUpperCase(chArr[i])) {
mark++;
flag = true;
// 若字符不为有效字符,且连续标识flag为true时,将之前有效字符输出
} else if (flag){
// 有效单词入栈
list.push(String.valueOf(chArr, i-mark, mark));
mark = 0;
flag = false;
}
}
// 最后一个字符为单词字符场景,flag为true
if (flag) {
// 有效单词入栈
list.push(String.valueOf(chArr, chArr.length-mark, mark));
}
// 栈中有元素时,循环出栈
while (list.size() > 0) {
// 单词出栈并输出
System.out.print(list.pop());
// 若栈非空,输出单词间间隔符号空格
if (!list.isEmpty()) {
System.out.print(" ");
}
}
}
}
}