文章目录
- 🎯 前言
- 🎯 题目描述
- 🎯 解题思路
- 📙 Python代码实现
- 📗 Java代码实现
- 📘 C语言代码实现
🎯 前言
🏆 《华为机试真题》专栏含2023年牛客网面经、华为面经试题、华为OD机试真题最新试题。
🏆 华为机试有三道题,第一道和第二道属于简单题,分值为100分,第三道为困难题,分值为200分,总分400分,150分钟考试时间。
🏆 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议!
🎯 题目描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计 数由多到少输出统计结果,如果统计的个数相同,则按照ASCI码由小到大排序输出。
数据范围:字符串长度满足 1<=len(str)<=1000。
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。
若出现次数相同,则按ASCII码的升序输出。
🎯 解题思路
题目要求按照不同字符统计次数,并按照次数从多到少输出,如果次数相同,则按照字符ASCII码从小到大输出。可以参考以下步骤实现:
- 首先,统计每个字符出现的次数,可以使用一个字典来存储,key为字符,value为出现的次数;
- 然后,按照出现次数从多到少排序,可以使用一个列表来存储结果,每个元素是一个元组,第一个元素是字符,第二个元素是出现的次数;
- 如果出现次数相同,按照字符ASCII码从小到大排序。需要定义一个比较器函数(可以使用lambda表达式),按照题目要求排序;
- 最后,遍历排序后的列表,按照题目要求输出结果。
📙 Python代码实现
s = input().strip()# 统计字符出现次数
cnt = {}
for c in s:
cnt[c] = cnt.get(c, 0) + 1
# 按照出现次数和字符ASCII码排序
result = sorted(cnt.items(), key = lambda x: (-x[1], ord(x[0])))
# 输出结果
for c, t in result:
print(c, t)
📗 Java代码实现
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine().trim();
// 统计字符出现次数
Map cnt = new HashMap < > ();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
cnt.put(c, cnt.getOrDefault(c, 0) + 1);
}
// 按照出现次数和字符ASCII码排序
List > list = new ArrayList < > (cnt.entrySet());
Collections.sort(list, new Comparator > () {@
Override
public int compare(Map.Entry o1, Map.Entry o2) {
if (o1.getValue() != o2.getValue()) {
return o2.getValue() - o1.getValue();
} else {
return o1.getKey() - o2.getKey();
}
}
});
// 输出结果
for (Map.Entry entry: list) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}
📘 C语言代码实现
#include
#include
#include
#define MAXN 1000
int cmp(const void * a,
const void * b) {
char x = * ((char * ) a), y = * ((char * ) b);
if (cnt[x] != cnt[y]) {
return cnt[y] - cnt[x];
} else {
return x - y;
}
}
int main() {
char s[MAXN + 1];
fgets(s, MAXN + 1, stdin);
int n = strlen(s) - 1;
// 统计字符出现次数
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < n; i++) {
char c = s[i];
cnt[c] ++;
}
// 按照出现次数和字符ASCII码排序
char chars[MAXN];
for (int i = 0; i < n; i++) {
chars[i] = s[i];
}
qsort(chars, n, sizeof(char), cmp);
// 输出结果
for (int i = 0; i < n; i++) {
if (i > 0 && cnt[chars[i]] == cnt[chars[i - 1]]) {
continue;
}
printf("%c %d\n", chars[i], cnt[chars[i]]);
}
return 0;
}
📭 本专栏包含了最新最全的2023年 华为OD机试真题,有详细的分析和解答。