LOADING STUFF...
百度&必应权4, 日IP8000. 查看详情
自助收录

2023年华为OD机考真题:字符串重新排序

算法刷题2年前 (2023)更新 江南白衣
609 0 0
2023年华为OD机考真题:字符串重新排序

全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。

真题库:https://www.yuque.com/codernav.com/od

题目:字符串重新排序
知识点:排序数组
时间限制: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
解题思路:
1、使用map来记录单词的使用次数(根据题意需要先对单词进行字母排序,也就是说只要字母都相同的就是同一个单词,不管其顺序)
2、将map转化为list进行sort排序,排序规则:
使用次数进行降序(map中value大的排在前面)
使用次数相同时,根据key的长度升序(key的长度短的排在前)
长度相同时,根据字典序进行升序
3、最后按序输出list中的字符

代码实现一:

package com.codernav.demo.hwod.exam;

import java.util.*;

/**
 * @title 字符串重新排序
 * @Description 给定一个字符串s,s包含以空格分隔的若干个单词,请对s进行如下处理后输出:
 * 1、单词内部调整:对每个单词字母重新按字典序排序;
 * 2、单词间顺序调整:
 * 1)统计每个单词出现的次数,并按次数降序排列;
 * 2)次数相同时,按单词长度升序排列;
 * 3)次数和单词长度均相同时,按字典序升序排列。
 * 请输出处理后的字符串,每个单词以一个空格分隔。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/14
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] strings = sc.nextLine().split(" ");
        Map<String, Integer> map = new HashMap<>();
        for (String string : strings) {
            char[] chars = string.toCharArray();
            Arrays.sort(chars);     //对单子中的字母进行字典排序
            String temp = String.valueOf(chars);
            map.put(temp, map.getOrDefault(temp, 0) + 1);  //统计每个单词出现的次数
        }

        List<Map.Entry<String, Integer>> list = new ArrayList<>(map.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;
        });

        StringBuilder res = new StringBuilder();
        for (Map.Entry<String, Integer> stringIntegerEntry : list) {
            for (int j = 0; j < stringIntegerEntry.getValue(); j++) {
                res.append(stringIntegerEntry.getKey()).append(" ");
            }
        }
        System.out.println(res.substring(0, res.length() - 1));
    }
}

代码实现二:

package com.codernav.demo.hwod.exam;

import java.util.*;

/**
 * @title 字符串重新排序
 * @Description 给定一个字符串s,s包含以空格分隔的若干个单词,请对s进行如下处理后输出:
 * 1、单词内部调整:对每个单词字母重新按字典序排序;
 * 2、单词间顺序调整:
 * 1)统计每个单词出现的次数,并按次数降序排列;
 * 2)次数相同时,按单词长度升序排列;
 * 3)次数和单词长度均相同时,按字典序升序排列。
 * 请输出处理后的字符串,每个单词以一个空格分隔。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/14
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] strings = sc.nextLine().split(" ");
        Map<String, Integer> map = new HashMap<>();
        for (String string : strings) {
            String temp = chuli(string);
            map.put(temp, map.getOrDefault(temp, 0) + 1);
        }

        List<Map.Entry<String, Integer>> list = new ArrayList<>(map.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().hashCode() - b.getKey().hashCode();
                }
            }
            return 1;
        });

        StringBuilder res = new StringBuilder();
        for (Map.Entry<String, Integer> stringIntegerEntry : list) {
            for (int j = 0; j < stringIntegerEntry.getValue(); j++) {
                res.append(stringIntegerEntry.getKey()).append(" ");
            }
        }
        System.out.println(res.substring(0, res.length() - 1));
    }

    public static String chuli(String s) {
        List<Character> list = new ArrayList<>();
        for (int i = 0; i < s.length(); i++) {
            list.add(s.charAt(i));
        }
        Collections.sort(list);
        StringBuilder res = new StringBuilder();
        for (Character character : list) {
            res.append(character);
        }
        return res.toString();
    }
}

 

© 版权声明

相关文章

暂无评论

暂无评论...