带指针的2d数组中最常见的字符

时间:2017-12-06 18:54:09

标签: c pointers frequency

我想找到5个字符串中最常见的字符,我想到了这一点,我已经为我的ocasion s中的特定字符做过,但我怎样才能为每个字符创建它,它只是我的代码的一部分

Ch是指针!!!

for(i = 0; i < five; i++){
    ch = strchr(cities[i], 's'); 

    if (ch != NULL){ //if this is true 
        ch1++;
        printf("exists in %s\n", cities[i]); //print
    }
    else
    {
        printf ("doesnt exist in %s\n", cities[i]); //print
    }
}
printf("The character 's' appears in %d cities\n", ch1);

2 个答案:

答案 0 :(得分:1)

你必须以某种方式存储某个地方每个角色的出现次数。

给定一个提示是保持一个变量存储字符的最大出现次数和字符本身。没有其他的。对于循环,您需要考虑从az的所有字符。

代码将类似于:-(只有当你觉得你已经尝试了足够的时候看看。)

为了让您了解此代码的作用 - 它会计算最大城市数量中出现的字符数。如果存在平局,则首先选择较小的字母(按字典顺序)。

  

for( char c = 'a'; c <= 'z';c++){
    int ch1 = 0, mxch1 = 0;
    char mch='?';
    for(i = 0; i < numOfCities; i++){
      ch=strchr(cities[i],c); 
        if( ch ){
           printf("Exist in %s\n",cities[i]);
           ch1++;
        }
        else
           printf("Doesn't Exist in %s\n",cities[i]);
    }
    if( ch1 > mch1) { 
      mch1 = ch1; 
      mch = c; 
  }
    printf("The character %c appears in %d cities\n",c,ch1);
}
printf("Character which occured in max number of cities is %c %d",mch,mch1);

最常见字符的代码会有所不同。

  

int charMap[26]={0};
for(size_t i = 0; i < numOfCities; i++){
  for(size_t j = 0; cities[i][j]; j++)
      charMap[cities[i][j]-'a']++;
}
int mx = 0;
mxi = 0;
for(size_t i = 0; i < sizeof(charMap)/sizeof(charMap[0]); i++){
  if(charMap[i]>mx){
      mx  = charMap[i];
      mxi = i;
  }

printf("Character which occured max number of times is %c %d", (char)(mxi+'a'),mx);

答案 1 :(得分:0)

如果输入严格仅由ASCII字符组成,则可以使用count sort在O(n)时间复杂度和O(1)空间复杂度中完成此任务。

保留一个数组int count[128] = {0};,用于跟踪每个字符出现的时间。您可以使用数组的索引作为字符的ASCII值。

for(int i = 0; i < 5; i++)
    for(int j = 0; cities[i][j] != '\0'; j++)
         count[cities[i][j]]++;  

如果您想忽略非图形字符,或者您只想计算字母数字字符或任何您的要求,则必须使用正确的函数组合添加if项检查(isalpha来自ctype.h

的,isalnum等)

您现在必须运行count数组并找到最大的数字。找到最大数字的索引是最常见字符的ASCII值。