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