牛客网|单词倒排

题目信息

对字符串中的所有单词进行倒排。

说明:

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(" ");
				}
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/magi1201/article/details/114712504