文章

1

粉丝

0

获赞

2

访问

208

头像
机试1452 单词识别 提问
我要提问
发布于2025年9月19日 17:06
阅读数 208

为什么我的代码通过率只有50%,自己在本地跑了没有问题呀?有没有大佬能看看哪里有问题呀?

 

#include<bits/stdc++.h>
using namespace std;

map<string,int> mp;

bool cmp(pair<string,int> a,pair<string,int> b){
    if(a.second==b.second){
        return a.first<b.first;
    }
    return a.second>b.second;
}


int main(){
    string s;
    getline(cin,s);
    int len=s.length();
    int cnt=0;
    for(int i=0;i<len;i++){
        if(s[i]==' '||s[i]==','||s[i]=='.'){
            string sub=s.substr(i-cnt,cnt);
            mp[sub]++;
            cnt=0;
        }else{
        ...

登录查看完整内容


登录后发布评论

2 条评论
snake
2025年9月21日 11:33

这段代码存在几个问题,导致无法正确处理所有输入情况,具体分析如下:

问题 1:未处理多行输入

题目明确说明 “输入有若干行”,但代码中仅使用getline(cin, s)读取了一行输入,会忽略后续行的内容,导致统计不完整。

问题 2:连续分隔符导致空字符串被统计

当出现连续的分隔符(如多个空格、逗号或句号相连)时,代码会截取空字符串并计入统计。例如输入"a,,b",第二个逗号会触发截取cnt=0的子串(空串),导致mp中出现空字符串的计数,这不符合 “单词” 的定义。

问题 3:字符串结尾的单词未被统计

如果输入的最后一个字符不是分隔符(如"hello world"结尾是d而不是分隔符),循环结束后,最后一个单词的字符会积累在cnt中,但不会被处理,导致该单词未被统计。

修正后的代码

#include<bits/stdc++.h>
using namespace std;

map<string, int> mp;

// 排序规则:按次数降序,次数相同按字母升序
bool cmp(pair<string, int> a, pair<string, int> b) {
    if (a.second == b.second) {
        return a.first < b.first;
    }
    return a.second > b.second;
}

int main() {
    string s;
    string line;
    // 读取所有行(解决多行输入问题)
    while (getline(cin, line)) {
        s += line;
    }
    
    int len = s.length();
    int cnt = 0; // 记录当前单词的长度
    
    for (int i = 0; i < len; i++) {
        // 遇到分隔符时处理前面的单词
        if (s[i] == ' ' || s[i] == ',' || s[i] == '.') {
            if (cnt > 0) { // 仅处理非空单词(解决连续分隔符问题)
                string sub = s.substr(i - cnt, cnt);
                mp[sub]++;
                cnt = 0;
            }
        } else {
            // 转换为小写(不区分大小写)
            if (s[i] >= 'A' && s[i] <= 'Z') {
                s[i] += 32;
            }
            cnt++;
        }
    }
    
    // 处理字符串结尾的单词(解决结尾单词未统计问题)
    if (cnt > 0) {
        string sub = s.substr(len - cnt, cnt);
        mp[sub]++;
    }
    
    // 排序并输出
    vector<pair<string, int>> v(mp.begin(), mp.end());
    sort(v.begin(), v.end(), cmp);
    for (auto& p : v) {
        cout << p.first << ":" << p.second << endl;
    }
    
    return 0;
}

修正说明

  1. 多行输入处理:通过while (getline(cin, line))循环读取所有行,拼接成一个字符串统一处理。
  2. 连续分隔符处理:仅当cnt > 0(即存在有效字符)时,才截取并统计单词,避免空字符串被计入。
  3. 结尾单词处理:循环结束后,检查cnt > 0,若成立则截取最后一个单词并统计,确保所有单词都被计数。

这样修改后,代码能正确处理题目要求的各种输入情况。

赞(1)

fufu204 : 回复 snake: 感谢大佬的详细解答!

2025年9月21日 13:52
回复给: