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

C语言:实现统计字符串最频繁字符出现次数的函数求助

解决字符串中出现次数最多字符的计数问题

嘿,我来帮你排查这段代码的问题,然后给你正确的实现方案。先看看你现有代码里的几个关键错误:

  • 变量名拼写错误:lenght应该是length,虽然编译器可能不会报错,但这是不规范的编程习惯,容易引发后续混淆。
  • 核心逻辑完全错误:if(string[i]==string[i++])这个判断完全偏离需求。首先i++会让循环变量i在每次判断时自动加1,导致循环跳过大量字符;其次这个判断只是比较当前字符和下一个字符是否相同,根本不是统计某个字符在整个字符串中的总出现次数。
  • 统计逻辑缺失:你没有针对每个字符去遍历整个字符串统计它的出现次数,只是在相邻字符相同时增加x,这只能统计连续相同字符的长度,而非某个字符的全局出现次数——比如"eleven"里的'e'出现3次但并不连续,你的代码完全无法统计到。

正确实现方案(高效版)

我们可以利用ASCII字符的范围(0-127),用一个数组来统计每个字符的出现次数,这种方法时间复杂度为O(n),效率很高:

#include <string.h> // 必须包含strlen的头文件

int most_frequent(char *string){
    // 初始化计数数组,所有元素默认值为0
    int count[128] = {0};
    int max_count = 0;
    int len = strlen(string);

    // 遍历字符串,统计每个字符的出现次数
    for(int i = 0; i < len; i++){
        // 将字符转为unsigned char避免ASCII值为负的情况(如扩展ASCII)
        count[(unsigned char)string[i]]++;
    }

    // 遍历计数数组,找到最大的出现次数
    for(int i = 0; i < 128; i++){
        if(count[i] > max_count){
            max_count = count[i];
        }
    }

    return max_count;
}

基础理解版(双重循环)

如果你想更直观地理解统计逻辑,可以用双重循环实现,虽然时间复杂度为O(n²),但适合初学者理解核心思路:

#include <string.h>

int most_frequent(char *string){
    int max_count = 0;
    int len = strlen(string);

    // 外层循环遍历每个字符
    for(int i = 0; i < len; i++){
        int current_count = 0;
        // 内层循环遍历整个字符串,统计当前字符的出现次数
        for(int j = 0; j < len; j++){
            if(string[i] == string[j]){
                current_count++;
            }
        }
        // 更新最大次数
        if(current_count > max_count){
            max_count = current_count;
        }
    }

    return max_count;
}

验证示例

  • 输入"overflow":字符'o'出现2次,其他字符均为1次,函数返回2,符合预期。
  • 输入"eleven":字符'e'出现3次,其他字符最多1次,函数返回3,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:16:10