全网最全面的华为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(); } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...