Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.76 KB | None | 0 0
  1. /*
  2.  * il problema chiede di contare quante volte una cifra si ripete in un numero es: 2001 ci sono 2 zeri, 1 uno
  3.  * ,1 due, 0 tre,0 quattro, 0 cinque.....e così via
  4.  *
  5.  * chiede poi di associare al numero con frequenza più alta la lettera a, poi b ecc...siccome le cifre sono 10
  6.  * (da 0 a 9) le lettere necessarie sono da a -> j;
  7.  *
  8.  * il programma inizia dalla funzione greedyCode()
  9.  *
  10.  * ricordo che vettori e matrici vengono passate solo per indirizzo in java, per cui ogni modifica effettuata su un
  11.  * vettore da un metodo modificherà per tutti il valore di quel vettore; quindi tutti i return matrice potevano essere evitati
  12.  *
  13.  * i nomi delle variabili sono un po' ad cazzum
  14.  *
  15.   */
  16.  
  17.  
  18. int[][] swap(int i, int j, int[][] a) {
  19.  
  20. /*funzione di swap dei valori come descritto in precedenza
  21.  *
  22.  */
  23.     int indice,valore;
  24.    
  25.     indice = a[0][i];
  26.     valore = a[1][i];
  27.    
  28.     a[0][i]=a[0][j];
  29.     a[1][i]=a[1][j];
  30.    
  31.     a[0][j]=indice;
  32.     a[1][j]=valore;
  33.      
  34.         return a;
  35. }
  36.  
  37.  
  38. int[][] ordinaFrequenza (int[][] m){
  39.    
  40.     //semplice bubblesort che confronta le frequenze (quindi la seconda riga della matrice) e
  41.     //le ordina in modo crescente spostando anche l'indice (riga 0 indice i)
  42.     //in pratica sposta le celle [1][j] e [0][j] in [1][j+1] e [0][j+1] rispettivamente
  43.     for(int i=0;i<10;i++){
  44.        
  45.         for(int j=0;j<9;j++){
  46.             if(m[1][j]<m[1][j+1]){
  47.                 m = swap(j,j+1,m);
  48.                
  49.             }
  50.            
  51.         }
  52.     }
  53.     return m;
  54. }
  55.  
  56.  
  57.  
  58.  
  59. int[][] calcolaFrequenza(long n, int[][] temp){
  60.         //questo metodo serve a ricavare le singole cifre del numero e a contare quante volte si ripetono
  61.     long b = n;
  62.     int i=0;
  63.     while(b>0){
  64.         b=b/10;     //con questo while si conta di quante cifre è formato il numero, è un po' inutile ma almeno si
  65.             i++;        // risparmia spazio nella creazione del vettore
  66.     }
  67.     int[] cifre = new int[i];   //vettore dove andranno le singole cifre
  68.     i=0;
  69.    
  70.     while(n>0){
  71.         cifre[i] =(int) n%10;   //con il %10 si ricava l'ultima cifra del numero è necessario un cast perché n è un long
  72.         n=n/10;//si toglie l'ultima cifra
  73.         i++;
  74.     }
  75.     int app;
  76.    
  77.     for (i = 0; i < 10; i++) {
  78.         temp[0][i] = i;             //inizializza la prima riga con gli indici da 0 a 9
  79.     }
  80.     for (i = 0; i < cifre.length; i++) {
  81.         app = cifre[i]; //in app ci finisce la cifra,ad es. 5  
  82.         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
  83.     }
  84.    
  85.    
  86.     temp = ordinaFrequenza(temp);
  87.    
  88.     return temp;
  89. }
  90.  
  91. char[] ordinaChar(int[][] m, char[] s){
  92.     char[] b = new char[10];    //con questo metodo si associa ad ogni indice la lettera corrispondente in base alla frequenza
  93.     int l;
  94.    
  95.     for(int i=0;i<b.length;i++){
  96.         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
  97.         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
  98.     }           //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
  99.         //d'arrivo mettendo all'indice l la lettera corrispondente;
  100.         //esempio: i==0    m[0][0] è uguale a 3    b[3]=s[0] <---- b sarà così b{'','','','a','','','','','',''}
  101.         //         i=1     m[0][1] è uguale a 2    b[2]=s[1] <---- b sarà = {'','','b','a','','','','','',''}
  102.    
  103.    
  104.     return b;
  105. }
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113. char[] greedyCode(long n) {
  114.    
  115.     int[][] frerf = new int[2][10]; //frerf è il vettore dovre andranno le cifre con la relativa frequenza
  116.     char[] bib = {'a','b','c','d','e','f','g','h','i','j'}; //vettore di char che andranno associati alle frequenze
  117.     frerf = calcolaFrequenza(n,frerf); 
  118.     bib = ordinaChar(frerf, bib);
  119.    
  120.     return bib;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement