【问题标题】:Counting most frequent character in a string计算字符串中出现频率最高的字符
【发布时间】:2018-04-19 23:07:00
【问题描述】:

我有一个复杂的C 程序,我只想编写一个获取字符串作为参数的函数。

int most_frequent(char *string)

函数必须返回字符串中出现频率最高的字符的编号。我尝试过这样的事情,但我认为这是不正确的:

 int most_frequent(char *string){
     int i, lenght;
     lenght=strlen(string);
     int max=0, x=0;
     for(i=0;i<lenght;i++)
     {
         if(string[i]==string[i++])
         {
             x++;
         }
         if(max<x)
             max=x;
     }
     return max;
 }

例如:“溢出” - 2 “十一” - 3

【问题讨论】:

  • 你的算法是错误的,你的代码正在计算最多的相同数字。
  • "返回最常见字符的数量'需要一个各种字符的出现计数表。if(string[i]==string[i++]) 简单测试两个后续string[] 是否相同。您需要一种新方法.
  • 先弄清楚如何在没有计算机的情况下解决这个问题,然后尝试编写代码。
  • 您可以使用频率表(如 chux 建议的那样),或使用两个嵌套的 for 循环。外循环选择一个字符。内部循环计算该字符的出现次数。
  • 尝试计算每个字符出现的频率并保存,然后返回你得到的最大的数字。例如,对于“溢出”:数'o'的个数,然后数'v'的个数,...最后返回最大个数。

标签: c string function


【解决方案1】:

我假设您有一个遵循 ASCII 的字符串。这样,每个字符就有 256 个可能的值。因此,我们计算每个频率并返回最大的频率。

int most_frequent(char *string){
     int count[256] = {0}; // Assum char is ASCII
     int max = 0;
     int i;

     for(i=0; i < strlen(string) ;i++) {
         count[(unsigned char)(string[i])] ++;
     }

     for(i=0; i < 256 ;i++) {
         if (count[i] > max) 
             max = count[i];
     }
     return max;
 }

【讨论】:

  • (int) 演员表不会阻止 this problem 并且没有什么用处。 (unsigned char) 演员会有所帮助。
  • 感谢您的快速回答,我在您的帮助下做到了!加油!
  • ASCII 很难正确使用,因为它的使用有限并且有很多关于它的错误信息。它从 0 到 127。而且,更一般的假设是每个“字符”都是一个 char。所以,不要使用 256,而是使用 UCHAR_MAX + 1(包括 &lt;limits.h&gt;),这与您对 unsigned char 的转换是一致的..
【解决方案2】:

执行以下操作:

// version that ignores the upper and lower case
int most_frequent(char *string) {
    int letterCout[26];

    // counts occurrence of each letter 
    for (int i = 0; i < strlen(string); ++i){
       // this counts characters if you are ignoring the case (upper or lower)
       if (string[i] >= 'a' && string[i] =< 'z')
           alphabet [string[i] - 'a']++;
       else if (string[i] >= 'A' && string[i] =< 'Z')
           alphabet [string[i] - 'A']++;
    }

    // finds which letter occurred the most
    int max = 0;
    for (int i = 0; i < strlen(string); ++i)
        if (letterCoutn[i] > max)
            max = letterCount[i];

    return max;
}

或者你可以这样做:

// version which does not ignore case but count the separately
int most_frequent(char *string) {
    int letterCout[52];  // 52 so you can count upper and lower case

    // counts occurrence of each letter 
    for (int i = 0; i < strlen(string); ++i){
       if (string[i] >= 'a' && string[i] <= 'z')
           alphabet [string[i] - 'a' + 26]++; // plus 26 so to offset in array so upper case could be counted in lower half of an array.
       else if (string[i] >= 'A' && string[i] <= 'Z')
           alphabet [string[i] - 'A']++;
    }

    // finds which letter occurred the most
    int max = 0;
    for (int i = 0; i < strlen(string) * 2; ++i)
        if (letterCoutn[i] > max)
            max = letterCount[i];

    return max;
}

【讨论】:

  • 感谢您的快速回答,我在您的帮助下做到了!加油!
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2013-12-20
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多