✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1、题目描述
- 2、输入描述
- 3、输出描述
- 4、Java算法源码
- 5. 测试
- 6.解题思路
1、题目描述
给定一个字串s,s包含以空格分隔的若干个单词,请对s进行如下处理后输出:
1、单词内部调整
对每个单词字母重新按字典序排序。
2、单词间顺序调整:
- 统计每个单词出现的次数,并按次数降序排列;
- 次数相同时,按单词长度升序排列;
- 次数和单词长度均相同时,按字典序升序排列。
请输出处理后的字符串,每个单词以一个空格分隔。
2、输入描述
行宁符串,每个宁符取值范围: [a-zA-Z0-9]以及空格,宁符串长度范围: [1,1000]。
3、输出描述
重新排序后的宁符串,每个单词间隔1个空格,且首属无空格。
4、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
String[] arr = line.split(" ");
Map<String, Integer> map = new HashMap<String, Integer>();
for (String str : arr) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
String key = String.valueOf(chars);
int val = map.getOrDefault(key, 0);
map.put(key, val + 1);
}
Set<Map.Entry<String, Integer>> entries = map.entrySet();
List<Map.Entry<String, Integer>> list = new ArrayList<>(entries);
list.sort( (a, b) -> {
String key1 = a.getKey();
String key2 = b.getKey();
Integer val1 = a.getValue();
Integer val2 = b.getValue();
if (val1 != val2) {
//如果次数不一样,按次数降序排序
return val2 - val1;
}else {
if (key1.length() != key2.length()) {
//次数相同时,按单词长度升序排列;
return key1.length() - key2.length();
}else {
//次数和单词长度均相同时,按字典序升序排列。
return key1.compareTo(key2);
}
}
});
StringBuilder builder = new StringBuilder();
for (Map.Entry<String, Integer> entry : list) {
String key = entry.getKey();
//出现的次数
Integer n = entry.getValue();
//这里要注意,出现多少次,就得打印多少个,因为key只保存一个
for (int i = 0; i < n; i++) {
builder.append(key).append(" ");
}
}
builder.deleteCharAt(builder.length() - 1);
System.out.println(builder);
}
5. 测试
6.解题思路
-
首先,将输入的字符串按空格分割成单词数组。
-
创建一个HashMap用于统计每个单词出现的次数。遍历单词数组,对每个单词进行字典序排序,并将排序后的单词作为键,出现次数作为值存入HashMap中。如果已经存在相同的键,则更新对应的值加1。
-
将HashMap中的键值对转换为列表,以便排序。
-
对列表进行排序,排序规则为:按照出现次数降序排列,如果次数相同,则按照单词长度升序排列,如果长度也相同,则按照字典序升序排列。
-
遍历排序后的列表,按照出现次数输出对应的单词。由于可能存在多个相同的单词,因此需要根据出现次数进行循环输出。
-
构建最终的结果字符串,每个单词之间以空格分隔,最后一个单词后不加空格。