字符串重新排序

知识点 排序 数组

时间限制:1s 空间限制:256MB 限定语言:不限

题目描述:

给定一个字符串s,s包含以空格分隔的若干个单词,请对s进行如下处理后输出:

1、单词内部调整:对每个单词字母重新按字典序排序;

2、单词间顺序调整:

1)统计每个单词出现的次数,并按次数降序排列;

2)次数相同时,按单词长度升序排列;

3)次数和单词长度均相同时,按字典序升序排列。

请输出处理后的字符串,每个单词以一个空格分隔。

输入描述:

一行字符串,每个字符取值范围:[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

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] str = in.nextLine().split(" ");
        Map<String, Integer> strMap = new HashMap<>();
        for (int i = 0; i < str.length; i++) {
            char[] vals = str[i].toCharArray();
            //单词内部调整:对每个单词字母重新按字典序排序
            Arrays.sort(vals);
            String x = String.valueOf(vals);
            strMap.put(x,strMap.getOrDefault(x,0)+1);
        }
        List<Map.Entry<String,Integer>> list = new ArrayList<>(strMap.entrySet());

        list.sort(( a, b)->{
            if(b.getValue() < a.getValue()){
                return -1;  //按次数降序
            }else if(b.getValue().equals(a.getValue())){     //次数相同
                if(b.getKey().length() > a.getKey().length()){
                    return -1;  //按字母长度升序
                }else if(b.getKey().length() == a.getKey().length()){   //字母长度相同
                    return a.getKey().compareTo(b.getKey());     //按字典序升序
                }
            }
            return 1;
        });

        String res = "";
        for(int i=0; i<list.size(); i++){
            for(int j=0;j<list.get(i).getValue();j++){
                res += list.get(i).getKey() + " ";
            }
        }

        System.out.println(res.substring(0, res.length()-1));
    }
}

全部评论
谢谢大佬
点赞
送花
回复
分享
发布于 2023-03-15 00:43 陕西

相关推荐

头像
不愿透露姓名的神秘牛友
03-25 17:16
已编辑
点赞 评论 收藏
转发
3 1 评论
分享
牛客网
牛客企业服务