Печатайте символы и их частоты в порядке вхождения в заданной строке, но я не могу понять строку "freq [str [i] - 'a'] ++;" - PullRequest
0 голосов
/ 27 сентября 2018

Печать символов и их частоты в порядке появления

Это ссылка на всю программу, если вы хотите узнать другие детали

Нижепрограммный

void printCharWithFreq(string str) 
  { 

int n = str.size(); 

// 'freq[]' implemented as hash table 
int freq[SIZE]; 

// initialize all elements of freq[] to 0 
memset(freq, 0, sizeof(freq)); 

// accumulate freqeuncy of each character in 'str' 
for (int i = 0; i < n; i++) 
    freq[str[i] - 'a']++;   //**cannot understand this line**

// traverse 'str' from left to right 
for (int i = 0; i < n; i++) { 

    // if frequency of character str[i] is not 
    // equal to 0 
    if (freq[str[i] - 'a'] != 0) { 

        // print the charcter along with its 
        // frequency 
        cout << str[i] << freq[str[i] - 'a'] << " "; 

        // update frequency of str[i] to 0 so  
        // that the same character is not printed  
        // again 
        freq[str[i] - 'a'] = 0; 
    } 
  } 

}

1 Ответ

0 голосов
/ 27 сентября 2018

Итак, пытаясь понять код, начинайте наизнанку, как в алгебре: freq[str[i] - 'a']++; Все символы представлены в виде целочисленных значений.Даже расширенный алфавит Unicode включает в себя старую таблицу ASCII в виде значений 0-255 (как символы были представлены в виде 8-битных целых).

Таблица значений ASCII:

enter image description here

str[i] - это i-тая буква строки, которая совпадает с массивом в C / C ++, поэтому к ней можно обращаться, используя скобочные обозначения от [0] до [n], гдеn==str.size();

freq[] - это массив, в котором мы будем хранить значения частоты для каждой буквы, инициализированные в 0 в каждом слоте командой memset(freq, 0, sizeof(freq));.Индекс каждого слота в массиве freq[] соответствует числовому представлению «насколько больше эта буква, чем строчная буква« а »».(Примечание: из этой реализации я предполагаю, что строка ввода str будет состоять из строчных букв (без прописных букв, знаков препинания или цифр). Таким образом, freq[0] соответствует количеству символов, которые на «0 больше, чем»«» или «a». Подсчеты для «b» можно найти в freq[1], подсчеты для «c» в freq[2] и т. д. до freq [25], который содержит подсчеты для z.

Итак, freq[str[i] - 'a'] обращается к слоту в массиве freq[], который соответствует соответствующей букве. Мы берем значение в этом слоте и увеличиваем его на 1, потому что мы только что обнаружили этот символ в str [i] . Помните, что в начале первого цикла for, который содержит строку кода, которую мы анализируем, все значения равны 0. Способ записи - это фрагмент кода, который вы процитировали: freq[str[i] - 'a']++;

...