任务:
创建一个函数maxRepeatingLetter,该函数接收一个字符串,并作为结果返回给定字符串中重复次数最多的字母(如果有多个字母满足给定条件,则返回英语字母表中的第一个字母),假设字符串中至少有一个字母。
代码:
#include <stdio.h>
char maxRepeatingLetter(const char *s)
{
int i, max = 0, maxIndex = 0;
int letter[26] = {0};
const char *pom = s;
while (*pom != '\0')
{
if ((*pom >= 'a' && *pom <= 'z'))
{
letter[*pom - 97]++;
}
if (*pom >= 'A' && *pom <= 'Z')
{
letter[*pom - 65]++;
}
pom++;
}
for (i = 0; i < 26; i++)
{
if (letter[i] > max)
{
max =letter[i]; maxIndex = I;
}
return maxIndex + 65;
}
int main ()
{
printf("Most repeating letter is: %c",
maxRepeatingLetter("input for letter to repeat"));
return 0;
}
我目前的任务是能够解释上面的代码和它是如何工作的。我需要输入一个小的变化到它,例如,添加一些东西到代码,或使它更简单。但不失去代码的主要功能。
有人愿意用2-3行来解释上面的代码吗?如果可以的话,请帮助我或提示我,甚至告诉我,我可以对代码进行哪些修改。
2条答案
按热度按时间oug3syen1#
我可以看到,你必须区分小写和大写,你可以只有字母,而不是符号,如?|^!ecc......所以我试着给予你一些建议:
1.尽量缩进代码,它将更可读的外部眼睛。
1.使用变量
letter
是一个好主意,但我不明白使用pom
的意义。1.如果您可以使用
string.h
库中的strlen()
函数,否则自己实现它可能是一个很好的练习。letter[*pom - 97]++
、letter[*pom - 65]++
和maxIndex + 65
依赖于ASCII表,请尝试letter[*pom - 'a']++
、letter[*pom - 'A']++
和maxIndex + 'A'
。for
循环不起作用,您遗漏了一个括号,因此if
不在for中。代码的解释很简单,首先你使用26个元素的数组
letter
,因为在字母表中我们有26个字母,所以第i个元素对应于字母表中的第i个字母。对字符串循环一次,并将第i个字母出现的次数保存在第i个元素
letter
中。使用
if
infor
循环,您只需在该数组中查找max,一旦找到它,您将返回max的索引,索引是出现频率更高的字母。对不起,我的英语不好,如果你需要更多的帮助,请告诉我。
q3qa4bjr2#
如果你正在寻找上面代码的解释,这是非常直接的。我建议使用多个打印来理解事情是如何发生的。这里是我的几个提示。
1.函数
maxRepeatingLetter()
在每次字符出现时更新计数器表letter[]
。1.此后,代码尝试在计数器表
letter[]
中查找最大数。