描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
注意有多组测试数据,即输入有多行,每一行单独处理(换行符隔开的表示不同行)
示例1
输入
A Famous Saying: Much Ado About Nothing (2012/8).
输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
解法
此题主要考查字符串和字符的操作,重点是字符的排序。
/* * Copyright (c) waylau.com, 2022. All rights reserved. */ package com.waylau.nowcoder.exam.oj.huawei; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Scanner; /** * HJ26 字符串排序. * 描述:编写一个程序,将输入字符串中的字符按如下规则排序。 * 规则 1 :英文字母从 A 到 Z 排列,不区分大小写。 * 如,输入: Type 输出: epTy * 规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。 * 如,输入: BabA 输出: aABb * 规则 3 :非英文字母的其它字符保持原来的位置。 * 如,输入: By?e 输出: Be?y * 注意有多组测试数据,即输入有多行,每一行单独处理(换行符隔开的表示不同行) * * @author <a href="https://waylau.com">Way Lau</a> * @since 2022-08-16 */ public class HJ026StringSort { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println(sort(sc.nextLine())); sc.close(); } private static String sort(String s) { // 定义字母列表 List<Character> letterList = new ArrayList<>(); // 将字符串转换成字符数组,遍历每一个字符,是字符则添加到列表中 for (Character c : s.toCharArray()) { if (Character.isLetter(c)) { letterList.add(c); } } // 按照小写英文字母排序规则排序 letterList.sort(Comparator.comparingInt(Character::toLowerCase)); StringBuilder result = new StringBuilder(); for (int i = 0, j = 0; i < s.length(); i++) { if (Character.isLetter(s.charAt(i))) { result.append(letterList.get(j++)); } else { // 若是非英文字母则直接添加 result.append(s.charAt(i)); } } return result.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