EncountersAgain 2021-09-24 09:17 采纳率: 66.7%
浏览 88
已结题

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

img

img

  • 写回答

2条回答 默认 最新

  • 广大菜鸟 2021-09-24 10:01
    关注
    #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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月24日
  • 已采纳回答 9月24日
  • 创建了问题 9月24日

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器