描述
对字符串中的所有单词进行倒排。
说明:
- 1、构成单词的字符只有26个大写或小写英文字母;
- 2、非构成单词的字符均视为单词间隔符;
- 3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
- 4、每个单词最长20个字母;
输入描述:输入一行以空格来分隔的句子
输出描述:输出句子的逆序
示例1
输入 I am a student 输出 student a am I复制
示例2
输入 $bo*y gi!r#l 输出 l r gi y bo复制
解法
考查对数组的倒序排序、字符校验。
/* * Copyright (c) waylau.com, 2022. All rights reserved. */ package com.waylau.nowcoder.exam.oj.huawei; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; /** * 描述:对字符串中的所有单词进行倒排。 * 说明: * 1、构成单词的字符只有26个大写或小写英文字母; * 2、非构成单词的字符均视为单词间隔符; * 3、要求倒排后的单词间隔符以一个空格表示; * 如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符; * 4、每个单词最长20个字母; * 输入描述:输入一行以空格来分隔的句子 * 输出描述:输出句子的逆序 * 示例1 * 输入:I am a student * 输出:student a am I * * @author <a href="">Way Lau</a> * @since 2022-08-17 */ public class HJ031WordInversion { public static void main(String[] args) { // 输入 Scanner sc = new Scanner(System.in); String in = sc.nextLine(); // 转为字符 char[] array = in.toCharArray(); char[] temp = new char[20]; int i = 0; boolean skip = false; List<String> list = new ArrayList<>(); for (char ch : array) { if (Character.isUpperCase(ch) || Character.isLowerCase(ch)) { temp[i] = ch; skip = false; i++; } else { // 忽略连续的非字母 if (!skip) { list.add(charToString(Arrays.copyOf(temp, i))); skip = true; // 缓存复原 temp = new char[20]; i = 0; } } } if (i > 0) { list.add(charToString(Arrays.copyOf(temp, i))); } // 倒序 StringBuilder sb = new StringBuilder(); for (int k = list.size() - 1; k >= 0; k--) { sb.append(list.get(k)); sb.append(" "); } // 输出 System.out.println(sb.toString().trim()); // 关闭 sc.close(); } public static String charToString(char[] chArray) { StringBuilder sb = new StringBuilder(); for (char ch : chArray) { sb.append(ch); } return sb.toString(); } }
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action>
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html