1. 编程练习解析:东华OJ基础题112-114
作为一名计算机专业的学生,刷OJ题是提升编程能力的必经之路。最近我在准备东华大学的复试,整理了112-114三道基础题的解题思路和代码实现。这三道题涵盖了字符统计、学生成绩处理和结构体排序等常见编程考点,非常适合用来巩固C++基础。
1.1 基础112:字符频度统计
这道题要求我们统计输入文本中各个字母出现的频率,并按频率从高到低输出,频率相同时按字母顺序输出。这是典型的哈希表应用场景,但用数组也能高效解决。
核心思路是:
- 创建一个包含26个元素的结构体数组,对应26个字母
- 遍历输入字符串,统计每个字母出现的次数
- 对统计结果进行排序,先按次数降序,次数相同按字母升序
- 输出非零统计结果
cpp复制#include <bits/stdc++.h>
using namespace std;
struct Ch {
int seq; // 字母序号(0-25对应A-Z)
int count; // 出现次数
};
int main() {
string line;
while(getline(cin, line)) {
Ch chs[26] = {};
// 初始化字母序号
for(int i = 0; i < 26; i++) {
chs[i].seq = i;
chs[i].count = 0;
}
// 统计字母出现次数
for(char c : line) {
if(c >= 'A' && c <= 'Z') chs[c-'A'].count++;
else if(c >= 'a' && c <= 'z') chs[c-'a'].count++;
}
// 冒泡排序:按次数降序,次数相同按字母升序
for(int i = 0; i < 25; i++) {
for(int j = 0; j < 25-i; j++) {
if(chs[j].count < chs[j+1].count ||
(chs[j].count == chs[j+1].count && chs[j].seq > chs[j+1].seq)) {
swap(chs[j], chs[j+1]);
}
}
}
// 输出结果
for(int i = 0; i < 26; i++) {
if(chs[i].count != 0) {
cout << ch
