La modalità è il singolo valore più comune. Chiaramente, devi semplicemente contare le occorrenze di ogni valore all'arrivo e alla fine cercare i conteggi per trovare il più grande. Ci sono alcune varianti interessanti.
Se e solo se (a) i valori sono interi (b) si conosce l'intervallo in anticipo (c) si conosce il limite superiore del conteggio, quindi è possibile preallocare una matrice di numeri interi adatti a contenere i conteggi. Questo è probabilmente il caso della tua situazione particolare.
Se (b) non è vero, puoi allocare un array ed essere pronto a ridimensionarlo al volo.
Se (a) non è vero, puoi usare un array hash (dizionario, mappa, ecc.) più o meno allo stesso modo, per alcuni costi delle prestazioni.
Se (c) non è vero (i conteggi potrebbero superare l'intervallo di int), è necessario essere pronti ad allocare un secondo array duplicato per contenere gli overflow. E un terzo, e così via.
Un ultimo aggiustamento. Se ricordi il valore e il conteggio più alto ogni volta che aggiorni la matrice, puoi evitare la ricerca finale.