字符串重新排序
知识点排序数组
时间限制: 1s 空间限制: 256MB 限定语言: 不限
题目描述:
给定一个字串s,s包含以空格分隔的若干个单词,请对s进行如下处理后输出:
1、单词内部调整:对每个单词字母重新按字典序排序
2、单词间顺序调整:
- 统计每个单词出现的次数,并按次数降序排列:
2)次数相同时,按单词长度升序排列; - 次数和单词长度均相同时,按字典序升序排列。
请输出处理后的字符串,每个单词以一个空格分隔。
输入描述:
行宁符串,每个宁符取值范围: [a-zA-Z0-9]以及空格,宁符串长度范围: [1,1000]
输出描述
重新排序后的宁符串,每个单词间隔1个空格,且首属无空格
示例1
输入:
This is an apple
输出:
an is This aelpp
示例2
输入:
My sister is in the house not in the yard
输出:
in in eht eht My is not adry ehosu eirsst
解题思路:
- 就是用map存放,key是字典排序后的字符串,value是次数,按照题目要求的进行排序就可以了,
- 要注意的地方就是: 在list打印的时候,这里要注意,出现多少次,就得打印多少个,因为key只保存一个,
package com.darling.boot.order.od.od33;import java.util.*;public class Main1 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String line = sc.nextLine();String[] strings = line.split(" ");Map<String, Integer> map = new HashMap<>();for (String str : strings) {char[] chars = str.toCharArray();Arrays.sort(chars);String key = String.valueOf(chars);int val = map.getOrDefault(key, 0);map.put(key, val + 1);}Set<Map.Entry<String, Integer>> entries = map.entrySet();List<Map.Entry<String, Integer>> list = new ArrayList<>(entries);list.sort( (a1, a2) -> {String key1 = a1.getKey();String key2 = a2.getKey();Integer value1 = a1.getValue();Integer value2 = a2.getValue();if (value1 != value2) {//如果次数不一样,按次数降序排序return value2 - value1;}else {if (key1.length() != key2.length()) {//次数相同时,按单词长度升序排列;return key1.length() - key2.length();}else {//次数和单词长度均相同时,按字典序升序排列。return key1.compareTo(key2);}}});StringBuilder sb = new StringBuilder();for (Map.Entry<String, Integer> entry : list) {String key = entry.getKey();//出现的次数Integer n = entry.getValue();//这里要注意,出现多少次,就得打印多少个,因为key只保存一个for (int i = 0; i < n; i++) {sb.append(key).append(" ");}}sb.deleteCharAt(sb.length() - 1);System.out.println(sb);}}