You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言实现移除字符串最高频单词的代码修复

核心问题修复说明

原有实现存在两个核心逻辑漏洞,对应修复点如下:

  • 并列最高频选词逻辑修复:原逻辑仅记录全局最高频次值,未记录最先达到该频次的单词标识,导致后续同频次单词会覆盖目标。修复后按单词出现顺序逐词统计频次,仅当当前单词频次严格大于已记录的最高频次时才更新移除目标,保证最先出现的高频词被选中。
  • 字符移除逻辑修复:原实现逐字符判断删除时偏移计算错误,易误删周边非单词字符或残留无效字符。修复后采用双指针原地修改方案,遇到单词时先整体识别判断是否为移除目标,非目标单词整体拷贝、非单词字符逐字符直接保留,目标单词直接跳过读指针不写入,完全保留单词周边的空格、标点等非单词内容。
约束合规说明

实现完全符合题目限制要求:

  • 未调用<string.h>、<stdlib.h>的任何库函数
  • 未使用sprintf、sscanf函数
  • 未定义全局或局部的辅助字符串,所有操作均在输入字符串原地址上完成
修复后完整实现代码
void remove_most_freq_word(char *s) {
    int i = 0, max_cnt = 0, tgt_start = -1, tgt_len = 0;
    // 第一次遍历:按出现顺序定位最先出现的最高频单词
    while (s[i] != '\0') {
        // 跳过非字母字符找单词起点
        while (s[i] != '\0' && !((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))) {
            i++;
        }
        if (s[i] == '\0') break;
        int cur_start = i;
        // 计算当前单词长度
        while (s[i] != '\0' && ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))) {
            i++;
        }
        int cur_len = i - cur_start;
        // 统计当前单词在整串中的出现次数
        int cnt = 0, j = 0;
        while (s[j] != '\0') {
            while (s[j] != '\0' && !((s[j] >= 'a' && s[j] <= 'z') || (s[j] >= 'A' && s[j] <= 'Z'))) {
                j++;
            }
            if (s[j] == '\0') break;
            int w_start = j;
            while (s[j] != '\0' && ((s[j] >= 'a' && s[j] <= 'z') || (s[j] >= 'A' && s[j] <= 'Z'))) {
                j++;
            }
            int w_len = j - w_start;
            if (w_len != cur_len) continue;
            // 逐字符转小写做不区分大小写匹配
            int match = 1;
            for (int k = 0; k < w_len; k++) {
                char c1 = s[cur_start + k], c2 = s[w_start + k];
                if (c1 >= 'A' && c1 <= 'Z') c1 += 32;
                if (c2 >= 'A' && c2 <= 'Z') c2 += 32;
                if (c1 != c2) {
                    match = 0;
                    break;
                }
            }
            if (match) cnt++;
        }
        // 仅频次严格更高才更新目标,保证并列时取最先出现的单词
        if (cnt > max_cnt) {
            max_cnt = cnt;
            tgt_start = cur_start;
            tgt_len = cur_len;
        }
    }
    // 无有效单词直接返回
    if (tgt_start == -1) return;
    // 第二次遍历:双指针原地移除目标单词
    int r = 0, w = 0;
    while (s[r] != '\0') {
        // 非字母字符直接保留
        if (!((s[r] >= 'a' && s[r] <= 'z') || (s[r] >= 'A' && s[r] <= 'Z'))) {
            s[w++] = s[r++];
            continue;
        }
        // 识别当前完整单词
        int w_start = r;
        while (s[r] != '\0' && ((s[r] >= 'a' && s[r] <= 'z') || (s[r] >= 'A' && s[r] <= 'Z'))) {
            r++;
        }
        int w_len = r - w_start;
        // 判断是否为待移除目标词
        int is_target = 0;
        if (w_len == tgt_len) {
            is_target = 1;
            for (int k = 0; k < w_len; k++) {
                char c1 = s[tgt_start + k], c2 = s[w_start + k];
                if (c1 >= 'A' && c1 <= 'Z') c1 += 32;
                if (c2 >= 'A' && c2 <= 'Z') c2 += 32;
                if (c1 != c2) {
                    is_target = 0;
                    break;
                }
            }
        }
        if (is_target) continue;
        // 非目标词完整拷贝
        for (int k = 0; k < w_len; k++) {
            s[w++] = s[w_start + k];
        }
    }
    // 补字符串结束符
    s[w] = '\0';
}
功能测试示例

所有测试用例均满足规则要求:

  • 输入:"Hello hello world world world",最高频词为world(出现3次),输出:"Hello hello "(保留所有原空格,仅移除3个world单词)
  • 输入:"Cat cat Dog dog dog Cat",cat和dog均出现3次,cat更靠近开头被选为目标,输出:" Dog dog dog "
  • 输入:"123 456 !@#$",无有效字母单词,输出与输入完全一致
  • 输入:"Test test TEST tEst",最高频词为test(出现4次),输出:" "(保留单词间的3个空格)

内容的提问来源于stack exchange,提问作者user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:36:26