在学习编程的过程中,遇到问题是很常见的事情,尤其是在解决算法题时。最近,在尝试解决NOI Online Judge上的“笨小猴”问题时,我的代码遇到了“Wrong Answer”(错误答案)的问题。经过一番排查和调整,终于找到了问题所在,并成功通过了测试。这里分享一下我的思路和解决方案,希望能帮助到同样遇到类似问题的朋友。
问题背景
“笨小猴”是一道经典的字符串处理题目。题目要求你从给定的一段文字中提取单词,并统计每个单词出现的频率,最后输出频率最高的单词及其出现次数。如果存在多个单词具有相同的最高频率,则输出字典序最小的那个。
题目看似简单,但实际操作中容易因为细节处理不当而导致“Wrong Answer”。比如,对大小写敏感、忽略标点符号等。
初步分析与实现
首先,我按照题目描述的基本逻辑编写了一个简单的程序:
```cpp
include
include
include
include
using namespace std;
int main() {
string s;
getline(cin, s); // 输入一行字符串
map
// 分割字符串并统计词频
string word = "";
for (char c : s) {
if (isalpha(c)) { // 只保留字母字符
word += tolower(c);
} else {
if (!word.empty()) {
word_count[word]++;
word = ""; // 清空当前单词
}
}
}
if (!word.empty()) { // 处理最后一个单词
word_count[word]++;
}
// 找出词频最高的单词
string max_word = "";
int max_freq = 0;
for (const auto &pair : word_count) {
if (pair.second > max_freq || (pair.second == max_freq && pair.first < max_word)) {
max_word = pair.first;
max_freq = pair.second;
}
}
cout << max_word << " " << max_freq << endl;
return 0;
}
```
遇到的问题
提交后,系统返回了“Wrong Answer”,提示部分测试用例未通过。经过多次调试,我发现以下几个潜在问题:
1. 标点符号处理不完全:虽然我使用了`isalpha`过滤非字母字符,但有些特殊符号(如连字符 `-` 或下划线 `_`)可能被误认为是合法字符。
2. 大小写统一性:虽然我将所有字母转换为小写,但某些测试用例可能包含大写字母或混合大小写的单词。
3. 单词边界判断:在分割单词时,忽略了连续空格或其他不可见字符的情况。
调整与优化
针对上述问题,我对代码进行了改进:
1. 增强标点符号过滤:除了`isalpha`外,还增加了对常见标点符号的检查。
2. 严格大小写处理:确保所有输入都被统一转换为小写。
3. 完善边界条件:增加对空字符串和纯标点符号行的处理。
修改后的代码如下:
```cpp
include
include
include
include
using namespace std;
bool is_valid_char(char c) {
return isalpha(c) || isspace(c); // 允许字母和空格
}
int main() {
string s;
getline(cin, s);
map
string word = "";
for (size_t i = 0; i < s.size(); ++i) {
char c = s[i];
if (is_valid_char(c)) {
if (isspace(c)) {
if (!word.empty()) {
word_count[to_string(word)]++;
word = "";
}
} else {
word += tolower(c);
}
}
}
if (!word.empty()) {
word_count[to_string(word)]++;
}
string max_word = "";
int max_freq = 0;
for (const auto &pair : word_count) {
if (pair.second > max_freq || (pair.second == max_freq && pair.first < max_word)) {
max_word = pair.first;
max_freq = pair.second;
}
}
cout << max_word << " " << max_freq << endl;
return 0;
}
```
最终结果
经过以上调整,重新提交代码后,所有测试用例均顺利通过!这次经历让我深刻体会到,编程不仅仅是写出功能正确的代码,还需要关注细节和边界情况。希望我的分享能对你有所帮助!
如果有其他小伙伴也遇到类似问题,欢迎一起交流探讨!


