2011-04-11 2 views
0

Это то, что я придумал, но я всегда получаю ошибку проверки времени выполнения # 2 - стек с переменной h был поврежден.Использование гистограммы для поиска наиболее распространенной буквы в массиве

int mostCommonLetter(char s[]) { 
    int i=0, h[26],k=0, max=0, number=0; 
    while (k < 26){ 
     h[k] = '0'; 
     k++; 
    } 
    while(s[i] != '\0'){ 
     h[whichLetter(s[i])] = h[whichLetter(s[i])]+1; 
     i++; 
    } 
    h[26] = '\0'; 
    for(i=0;h[i]!='\0';i++){ 
     if(h[i] > max) 
      number=i; 
    } 
    return number; 
} 

ответ

3

Вы не можете сделать h[26] = '\0'; - час имеет 26 элементов индексироваться 0..25. Поскольку вы знаете длину h, вам не нужно 0-оканчивать ее, просто сделайте for (i=0; i < 26; ++i)

Кроме того, вы уверены, что whichLetter всегда возвращает значение в диапазоне 0..25? Что он делает, если это, например, сталкивается с пробелом?

+0

whichLetter возвращает -1, когда он встречает пространство – user133466

+0

@ user133466: Это также сломается - вам нужно проверить это, и если возвращаемое значение равно -1, не изменяйте h – Erik

1

Об этом пишет в конце прошлого массива:

h[26] = '\0'; 

Сделать цикл зависит от длины, а не последний символ:

for(i=0;i<26;i++){ 
    if(h[i] > max) 
     number=i; 
} 
Смежные вопросы