주제 정보
문자열의 모든 단어를 반전합니다.
기술:
1. 단어를 구성하는 문자에 26 개의 대문자 또는 소문자 만 있습니다.
2. 단어를 형성하지 않는 문자는 단어 스페이서로 간주됩니다.
3. 반전 된 단어 스페이서는 단일 공백으로 표시되어야하며 원래 문자열에서 인접한 단어 사이에 여러 개의 공백이있는 경우 반전 된 변환 후에 하나의 공백 공백 만 허용됩니다.
4. 각 단어의 최대 길이는 20 자입니다.
입력 예 : i2am @ a student
샘플 출력 : 학생 a am i
코딩
방법 1 , 버퍼 문자를 사용하여 단어를 저장하고 단어의 출력을 반전
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));
}
}
}
방법 2 , 스택 선입 선출 원칙을 사용하여 단어를 선입 선출 (first-in-last-out)하고 단어의 역 처리를 방지합니다.
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(" ");
}
}
}
}
}