Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * il problema chiede di contare quante volte una cifra si ripete in un numero es: 2001 ci sono 2 zeri, 1 uno
- * ,1 due, 0 tre,0 quattro, 0 cinque.....e così via
- *
- * chiede poi di associare al numero con frequenza più alta la lettera a, poi b ecc...siccome le cifre sono 10
- * (da 0 a 9) le lettere necessarie sono da a -> j;
- *
- * il programma inizia dalla funzione greedyCode()
- *
- * ricordo che vettori e matrici vengono passate solo per indirizzo in java, per cui ogni modifica effettuata su un
- * vettore da un metodo modificherà per tutti il valore di quel vettore; quindi tutti i return matrice potevano essere evitati
- *
- * i nomi delle variabili sono un po' ad cazzum
- *
- */
- int[][] swap(int i, int j, int[][] a) {
- /*funzione di swap dei valori come descritto in precedenza
- *
- */
- int indice,valore;
- indice = a[0][i];
- valore = a[1][i];
- a[0][i]=a[0][j];
- a[1][i]=a[1][j];
- a[0][j]=indice;
- a[1][j]=valore;
- return a;
- }
- int[][] ordinaFrequenza (int[][] m){
- //semplice bubblesort che confronta le frequenze (quindi la seconda riga della matrice) e
- //le ordina in modo crescente spostando anche l'indice (riga 0 indice i)
- //in pratica sposta le celle [1][j] e [0][j] in [1][j+1] e [0][j+1] rispettivamente
- for(int i=0;i<10;i++){
- for(int j=0;j<9;j++){
- if(m[1][j]<m[1][j+1]){
- m = swap(j,j+1,m);
- }
- }
- }
- return m;
- }
- int[][] calcolaFrequenza(long n, int[][] temp){
- //questo metodo serve a ricavare le singole cifre del numero e a contare quante volte si ripetono
- long b = n;
- int i=0;
- while(b>0){
- b=b/10; //con questo while si conta di quante cifre è formato il numero, è un po' inutile ma almeno si
- i++; // risparmia spazio nella creazione del vettore
- }
- int[] cifre = new int[i]; //vettore dove andranno le singole cifre
- i=0;
- while(n>0){
- cifre[i] =(int) n%10; //con il %10 si ricava l'ultima cifra del numero è necessario un cast perché n è un long
- n=n/10;//si toglie l'ultima cifra
- i++;
- }
- int app;
- for (i = 0; i < 10; i++) {
- temp[0][i] = i; //inizializza la prima riga con gli indici da 0 a 9
- }
- for (i = 0; i < cifre.length; i++) {
- app = cifre[i]; //in app ci finisce la cifra,ad es. 5
- temp[1][app]++; //nella seconda riga si incrementa quante volte è stato trovato un numero, se app==5 allora si incrementa la posizione (1,5) per segnare quante volte è apparso il 5
- }
- temp = ordinaFrequenza(temp);
- return temp;
- }
- char[] ordinaChar(int[][] m, char[] s){
- char[] b = new char[10]; //con questo metodo si associa ad ogni indice la lettera corrispondente in base alla frequenza
- int l;
- for(int i=0;i<b.length;i++){
- l=m[0][i]; //ricordo che m è ordinato anche con gli indici, per cui l'indice più a sinistra rappresenta il numero con più frequenza
- b[l]=s[i]; //siccome poi dovremmo riordinare il vettore di char in base all'indice della prima riga della matrice facendo così si risparmia un po' di lavoro
- } //in pratica mette in l il valore dei numeri da quelli con più a quelli con meno frequenza, come detto sopra ordino direttamente il vettore
- //d'arrivo mettendo all'indice l la lettera corrispondente;
- //esempio: i==0 m[0][0] è uguale a 3 b[3]=s[0] <---- b sarà così b{'','','','a','','','','','',''}
- // i=1 m[0][1] è uguale a 2 b[2]=s[1] <---- b sarà = {'','','b','a','','','','','',''}
- return b;
- }
- char[] greedyCode(long n) {
- int[][] frerf = new int[2][10]; //frerf è il vettore dovre andranno le cifre con la relativa frequenza
- char[] bib = {'a','b','c','d','e','f','g','h','i','j'}; //vettore di char che andranno associati alle frequenze
- frerf = calcolaFrequenza(n,frerf);
- bib = ordinaChar(frerf, bib);
- return bib;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement