牛客网-字符串重排-MY

270 阅读2分钟

题目

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

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

2、单词间顺序调整:

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

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

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

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

代码

package org.example.niuke;

import org.junit.jupiter.api.Test;

import java.util.*;
import java.util.stream.Collectors;

public class strSort {
    // 第一版
    public static void main(String[] args) {
        String s1 = "My sister is in the house not in the yard";
        String[] s = s1.split(" ");
        Arrays.stream(s)
                .map(a -> a.chars()
                        .sorted()
                        .mapToObj(i->String.valueOf((char)i))
                        .collect(Collectors.joining()))
                .collect(Collectors.toMap(k -> k, v -> 1, (a, b) -> a + 1))
                .entrySet().stream()
                .sorted((a,b)->{
                    if(a.getValue()>b.getValue()){
                        return -1;
                    } else if (a.getValue().equals(b.getValue())) {
                        if (a.getKey().length()<b.getKey().length()){
                            return -1;
                        }
                    } else if (a.getValue()==b.getValue()
                            &&a.getKey().length()==a.getKey().length()) {
                        if (a.getKey().charAt(0)<b.getKey().charAt(0)){
                            return -1;
                        }
                    }
                    return 0;
                })
                .forEach(System.out::println);
//                .map(x->x.getKey())
//                .collect(Collectors.joining(" ")));

        System.out.println("正确输出: in in eht eht My is not adry ehosu eirsst");
    }
    // 第二版
    @Test
    void t1(){
        String s1 = "My sister is in the house not in the yard";

        // 单词内部调整:对每个单词字母重新按字典序排序;
        List<String> collect = Arrays.stream(s1.split(" "))
                .map(a -> a.chars()
                        .sorted()
                        .mapToObj(i -> String.valueOf((char) i))
                        .collect(Collectors.joining()))
                .collect(Collectors.toList());

        // 添加至hashmap,计算单词出现次数
        Map<String, Integer> map = collect.stream().collect(Collectors.toMap(k -> k, v -> 1, (a, b) -> a + 1));

        // 生成最终字符串
        String str = collect.stream()
                .sorted((a, b) -> {
                    // 统计每个单词出现的次数,并按次数降序排列;
                    if (map.get(a) > map.get(b)) {
                        return -1;

                    // 次数相同时,按单词长度升序排列;
                    } else if (map.get(a).equals(map.get(b))) {
                        if (a.length() < b.length()) {
                            return -1;
                        }

                    // 次数和单词长度均相同时,按字典序升序排列。
                    } else if (map.get(a) == map.get(b)
                            && a.length() == a.length()) {
                        if (a.charAt(0) < b.charAt(0)) {
                            return -1;
                        }
                    }
                    return 0;
                })
                // 生成字符串,每个单词以一个空格分隔。
                .collect(Collectors.joining(" "));
        System.out.println("结果: "+str);

        System.out.println("正确输出: in in eht eht My is not adry ehosu eirsst");
    }
}


总结

第一版想一次流到底,但是hashmap的entrySet的流会导致key唯一的问题,也就是字符串中两个in,只能输出一个。表演失败。

写不出来也不用太纠结,毕竟思想才是灵魂。