#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;
}
```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;
}
```