用c语言解决问题,并附上代码注释

img

img

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<memory.h>
void strlen_pro(const char*str){
    int size = strlen(str);//strlen()用来计算指定的字符串s 的长度,不包括结束字符”\0”
    //chArray和occurArray按顺序对应出现的字符和它对应的频数,相对于字典dict[ch]=num
    char*chArray = (char*)malloc(sizeof(char)*size);//字符数组
    int*countArray=(int*)malloc(sizeof(int)*size);//频数数组
    // char*occurCharArray=(char*)malloc(sizeof(char)*size);
    char occurCharArray;//表示第一个出现最高频率的字符,其实可以不用上面的字符数组保存所有的相同最高频率的字符,只需要保存第一个
    memset(countArray,-1,sizeof(int)*size);//全部频数置为-1,其实也可以不用,习惯初始化下数组比较好
    // count表示字符-频数组合的个数,in是代表bool型,表示判断字符是否在字符-频数组合里出现,没有就加上
    // maxTime表示字符-频数组合内最大的频数
    // time表示字符-频数组合内字符对应的频数
    // resultCount表示最终结果的个数
    // 思路:先遍历一遍,获取每个字符的频数,再对频数遍历一边,判断出最多频数和为这个频数值的所有字符
    int i,j,count=0,in=0,maxTime=0,time=0,resultCount=0;
    char ch;
    for(i=0;i<size;i++){
        ch = str[i];
        in = 0;
        for(j=0;j<count;j++){
            if(chArray[j]==ch){
                in=1;
                countArray[j]+=1;
                break;
            }
        }
        if(in==0){
            chArray[j]=ch;
            countArray[j]=1;
            count+=1;            
        }
    }
    resultCount=1;
    maxTime=countArray[0];
    //occurCharArray[0]=chArray[0]; 
    occurCharArray=chArray[0];
    for(i=1;i<count;i++){// 根据字符-频率排序
        time=countArray[i];//出现频率
        if(time>maxTime){
            // 出现比当前最大频数还大的频数,之前的数组没用了,需要重新填充,
            // 但是不需要全部清空再填充,只需要用resultCount记录数组有效位置个数
            maxTime=time;
            resultCount=1;            
            //occurCharArray[0]=chArray[i];
            occurCharArray=chArray[i];
        }else if(time==maxTime){
            //occurCharArray[resultCount]=chArray[i];
            resultCount+=1;
        }
    }
    if(resultCount==1)
        printf("%d %c\n",size,occurCharArray);
        //printf("%d %c\n",size,occurCharArray[0]);
    else
        printf("%d They are too many!!!\n",size);
    free(countArray);
    free(chArray);
    //free(occurCharArray);
}
int main(){
    char str[1000];
    scanf("%s",str); //abcde
    strlen_pro(str);
    system("pause"); // 这个是因为我用vscode,它不加这句会闪退
    return 0;
}

img

img



```c
#include<stdio.h>
#include <iostream>
#include <vector>


void strlen_pro(const char *str)
{
    // 定义结构
    struct  element
    {
        int num = 0; // 相同字符个数
        char str = NULL;  // 对应字符
    };
    int length = 0; // 数组长度
    char res[1000] = { 0 };
    strncpy(res, str, sizeof(res));
    length = strlen(str);
    std::vector<element> vec;

    // 循环遍历数组,存储对应信息
    for (int i = 0; i < length; i++)
    {
        element elem;
        int j = 0;
        for (; j < vec.size(); j++)
        {
            if (res[i] == vec[j].str)
            {
                vec[j].num++;
                break;
            }
            
        }
        elem.num++;
        elem.str = res[i];
        vec.push_back(elem);

    }
    int max = vec[0].num;
    char c = vec[0].str;
    bool equal = false; // 标志字符出现次数最多是否有相同
    // 找到字符出现次数最多的一个
    for (int k = 1; k < vec.size(); k++)
    {
        if (vec[k].num > max)
        {
            max = vec[k].num;
            c = vec[k].str;
            equal = false;
        }
        else if (vec[k].num == max)
        {
            equal = true;
        }
    }
    if (equal)
    {
        printf("%d They are too many!!!\n", length);
    } 
    else
    {
        printf("%d %c\n", length, c);
    }
}

int main()
{
    char str[1000];
    scanf("%s", &str);
    strlen_pro(str);
    system("pause");
    return 0;
}

```