- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
java解法
- 解题思路
- 本题的目的是对给定的一组单词进行排序,排序规则如下:
按照单词出现的频率从高到低进行排序。
如果多个单词的频率相同,则按单词的长度从短到长排序。
如果频率和长度都相同,则按字典序(即字母顺序)排序。
具体步骤:
标准化单词:首先对每个单词中的字母进行排序。这样,不同字母顺序的单词将会被视为相同。例如,“abc”、“bca”、“cab” 都会被转换为 “abc”。
统计单词频率:使用 TreeMap 来记录每个标准化后的单词的出现次数。TreeMap 会根据字母顺序对单词进行自动排序,但在本题中并不依赖于它的自然顺序,主要用于统计。
自定义排序规则:根据以下优先级对单词进行排序:
频率:出现次数较多的单词排在前面。
长度:出现次数相同的情况下,按单词的长度从短到长排序。
字典序:如果频率和长度都相同,按字典顺序排序。
生成排序结果:最后根据排序后的顺序构建输出字符串。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
System.out.println(processWords(input));
}
public static String processWords(String s) {
String[] words = s.split(" ");
Map<String, Integer> countMap = new TreeMap<>();
for (String word : words) {
char[] chars = word.toCharArray();
Arrays.sort(chars);
String sortedWord = new String(chars);
countMap.put(sortedWord, countMap.getOrDefault(sortedWord, 0) + 1);
}
List<Map.Entry<String, Integer>> entryList = new ArrayList<>(countMap.entrySet());
entryList.sort((a, b) -> {
if (!b.getValue().equals(a.getValue())) {
return b.getValue() - a.getValue();
} else {
return a.getKey().length() - b.getKey().length() != 0 ? a.getKey().length() - b.getKey().length() : a.getKey().compareTo(b.getKey());
}
});
StringBuilder result = new StringBuilder();
for (Map.Entry<String, Integer> entry : entryList) {
for (int i = 0; i < entry.getValue(); i++) {
result.append(entry.getKey()).append(" ");
}
}
return result.toString().trim();
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
C++解法
- 解题思路
- 本题要求对输入的一组单词进行排序,排序规则如下:
频率排序:按照单词的出现频率,从高到低排序。
长度排序:如果两个单词的频率相同,按单词的长度,从短到长排序。
字典序排序:如果频率和长度都相同,则按字典序排序。
具体步骤:
标准化单词:每个单词需要进行字母排序。这样不同字母顺序的单词被视为相同,例如,“abc”和“cab”都应该视为“abc”。
统计单词的频率:使用 unordered_map 统计标准化后的单词出现的次数。
排序:对单词列表按照以下规则进行排序:
首先按出现频率降序排序。
如果频率相同,按单词的长度升序排序。
如果频率和长度都相同,按字典序排序。
输出排序后的结果:最终输出排序后的单词列表,用空格分隔
#include
#include
#include
#include
#include
#include
using namespace std;
// 用于排序每个单词中的字母
void reorder(string &t) {
sort(t.begin(), t.end()); // 对字符串中的字母进行排序
}
int main() {
string line;
getline(cin, line); // 读取整行输入
stringstream strStream(line); // 将输入的字符串转换为 stringstream 流,方便逐个单词读取
string token;
vector list; // 用于存储处理后的单词列表
unordered_map frequency; // 用于存储每个标准化单词的出现频率
// 逐个单词读取,并进行字母排序,统计频率
while (strStream >> token) {
reorder(token); // 对单词中的字母进行排序
list.push_back(token); // 将排序后的单词加入列表
frequency[token]++; // 统计该单词的出现次数
}
// 对单词列表进行排序,排序规则:
// 1. 按照单词频率降序排序
// 2. 如果频率相同,按单词长度升序排序
// 3. 如果频率和长度都相同,按字典序排序
stable_sort(list.begin(), list.end(), [&](const string &s1, const string &s2) {
if (frequency[s1] != frequency[s2]) {
return frequency[s1] > frequency[s2]; // 频率较高的排在前面
} else if (s1.size() != s2.size()) {
return s1.size() < s2.size(); // 长度较短的排在前面
} else {
return s1 < s2; // 如果频率和长度都相同,则按字典序排序
}
});
// 输出排序后的单词列表,单词之间用空格分隔
for (size_t i = 0; i < list.size(); ++i) {
cout << list[i];
if (i < list.size() - 1) {
cout << " "; // 如果不是最后一个单词,添加空格
}
}
return 0;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
频率排序:单词的排序首先依赖于它们的出现频率,从高到低排序。
长度排序:如果两个单词的频率相同,按单词的长度从短到长排序。
字典序排序:如果频率和长度都相同,按字典序排序。
详细步骤:
标准化单词:将每个单词中的字母按字典顺序排序。这样不同字母顺序的单词将被视为相同(例如,“abc”和“cab”会都被标准化为“abc”)。
统计单词的频率:使用 Map 来统计每个标准化单词的出现次数。
排序:对单词列表进行排序,排序规则是:
按出现频率降序排序。
如果频率相同,则按单词的长度升序排序。
如果频率和长度都相同,则按字典序排序。
输出结果:输出排序后的单词列表,用空格分隔。
function reorder(t) {
return t.split('').sort().join('');
}
function processWords(input) {
const words = input.split(' ');
const countMap = new Map();
for (let word of words) {
const sortedWord = reorder(word);
countMap.set(sortedWord, (countMap.get(sortedWord) || 0) + 1);
}
const entryList = Array.from(countMap.entries());
entryList.sort((a, b) => {
if (b[1] !== a[1]) {
return b[1] - a[1];
}
else if (a[0].length !== b[0].length) {
return a[0].length - b[0].length;
}
else {
return a[0].localeCompare(b[0]);
}
});
const result = [];
for (let [key, value] of entryList) {
for (let i = 0; i < value; i++) {
result.push(key);
}
}
return result.join(' ');
}
function main() {
const line = require('fs').readFileSync('/dev/stdin', 'utf-8').trim();
console.log(processWords(line));
}
main();
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: