Grade 10 · Character stringsCitește în română

Letter frequency

Original: Frecvența literelor

O(n)C++1738 lines1 example

The idea

We count how many times each letter appears, without distinguishing uppercase from lowercase: tolower(c) - 'a' gives the letter's position in the frequency array (0 for a, 25 for z). In alphabetical order, we print only the letters that appear, each with its number of occurrences.

Original description (Romanian)

Numărăm de câte ori apare fiecare literă, fără să facem diferența între literele mari și cele mici: tolower(c) - 'a' dă poziția literei în vectorul de frecvență (0 pentru a, 25 pentru z). Afișăm, în ordine alfabetică, doar literele care apar, fiecare cu numărul de apariții.

Complexity
O(L + 26)
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

Ana are mere

Expected output

a 3
e 3
m 1
n 1
r 2

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

frecventa-literelor.cpp
/*
 * Titlu: Frecvența literelor
 * Clasa: 10
 * Capitol: Șiruri de caractere
 * Descriere: Numărăm de câte ori apare fiecare literă, fără să facem diferența între
 *            literele mari și cele mici: tolower(c) - 'a' dă poziția literei în
 *            vectorul de frecvență (0 pentru a, 25 pentru z). Afișăm, în ordine
 *            alfabetică, doar literele care apar, fiecare cu numărul de apariții.
 * Complexitate: O(L + 26)
 *
 * Exemplu
 * Intrare: Ana are mere
 * Ieșire:
 * a 3
 * e 3
 * m 1
 * n 1
 * r 2
 */
#include <iostream>
#include <cctype>
using namespace std;

int main()
{
    char s[256];
    cin.getline(s, 256);
    int fr[26] = {0};
    for (int i = 0; s[i] != '\0'; i++)
        if (isalpha(s[i]))
            fr[tolower(s[i]) - 'a']++;

    for (int c = 0; c < 26; c++)
        if (fr[c] > 0)
            cout << char('a' + c) << ' ' << fr[c] << '\n';
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.