Pages: [1]   Go Down
Print
Author Topic: Numero occorrenze  (Read 1088 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
frankielee
Matricola
*
Offline Offline

Gender: Female
Posts: 15



« on: 21-11-2011, 16:33:09 »

Salve ragazzi,
avrei un dubbio riguardo questo esercizio:
Scrivere un metodo che prenda in input due array A e B di int .e restituisca l'elemento che occorre più volte nei due array(anche in uno solo di essi). N.B=non si possono utilizzare array ausiliari!
Es: A={3,2,5,3,7,2}  B={8,2,5,1,7,7,3,7}.Il 2 e il 3 occorrono 3 volte,il 5 occorre 2 volte,l'8 e l'1 occorrono 1 volta ed il 7 occorre 4 volte;pertanto l'output sarà 7.

E io l'ho risolto in questo modo: http://nopaste.info/42510cdf48.html

Con l'esempio descritto sopra mi funziona perfettamente,ma,pensandoci bene,.come dovrei fare se trovassi 2 numeri che si ripetono per lo stesso numero di volte?
E se tutti numeri si ripetessero una volta sola?
Ho pensato che è necessario utilizzare un nuovo array ma l'esercizio chiede esplicitamente di non usarlo.
Ho,anche,chiesto chiarimento al professore che mi ha confermato la necessità di utilizzare un nuovo array ma questo esercizio lo diede circa 3 anni fa nell'appello di settembre.Presumo,quindi,che si possa fare senza array ausiliario.Potreste aiutarmi?Ho iniziato da poco a studiare questa materia e vorrei capire come fare,è da giorni che ci penso.  boh

Grazie anticipatamente.
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 21-11-2011, 16:48:08 »

Ti do un suggerimento: ordina i due array prima .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
frankielee
Matricola
*
Offline Offline

Gender: Female
Posts: 15



« Reply #2 on: 21-11-2011, 17:02:21 »

Scusami la domanda stupida ma come dovrei ordinarli?
Dal numero che si ripete più volte fino a quello che ha un numero di occorrenze minore?
Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #3 on: 21-11-2011, 17:26:37 »

Hai ragione. Non serve ordinarli. Studia questo codice univ (ma dopo averlo copiato-incollato in un editor di testo con font monospaziato testate):
Code:
public static int metodo (int [] A, int [] B) throws Exception
{
    int num = 0, count = 0;                                                 //l'inizializzazione di num qui non è strettamente necessaria (si può dimostrare), ma è stata inserita perché il compilatore si lamenta (in fondo è solo una macchina stupida...)
    
    if (A != null && A.length > 0) num = A [0] + ((count = 1) - 1);         //doppia assegnazione in un'unica istruzione: equivale a {num = A[0]; count = 1;}
    if (B != null && B.length > 0) num = B [0] + ((count = 1) - 1);         //doppia assegnazione in un'unica istruzione: equivale a {num = B[0]; count = 1;}
    
    if (count == 0) throw new Exception ("ti sei scordato di inserire almeno un elemento in almeno un array!");
    
    for (int i = 0; i < A.length; i++)                                      //ciclo per A
    {
        int curCount = 0;
        for (int j = 0; j < A.length; j++)
            curCount += 1 - Math.min (1, Math.abs (A [i] - A [j]));         //equivale a: if (A [i] == A[j]) count++;     ma così è più divertente XD

        if (curCount > count) count = curCount + ((num = A [i]) - A [i]);   //doppia assegnazione in un'unica istruzione: equivale a {count = curCount; num = A [i];}
    }

    for (int i = 0; i < B.length; i++)                                      //ciclo per B
    {
        int curCount = 0;
        for (int j = 0; j < B.length; j++)
            curCount += 1 - Math.min (1, Math.abs (B [i] - B [j]));         //equivale a: if (B [i] == B[j]) count++;     ma così è più divertente XD

        if (curCount > count) count = curCount + ((num = B [i]) - B [i]);   //doppia assegnazione in un'unica istruzione: equivale a {count = curCount; num = B [i];}
    }
    
    return num;
}

Questo codice risponde anche alle tue domande:
Se trova più numeri che si presentano la stessa quantità massima di volte in un array, sceglie il primo (da sinistra) per quell'array e se trova due numeri che si presentano la stessa quantità massima di volte (uno per ciascun array), sceglie quello dell'array A.

Si può optare per scegliere (in quest'ultimo caso) quello dell'array B, banalmente invertendo i cicli; e si può optare per selezionare l'ultimo (invece del primo) di una sequenza di interi con la stessa frequenza massima, sostituendo (curCount > count) con (curCount >= count) e osservando che la convenzione sull'elemento di A o B (in caso di parità di freq. massima nei due array) viene invertita automaticamente .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
frankielee
Matricola
*
Offline Offline

Gender: Female
Posts: 15



« Reply #4 on: 21-11-2011, 17:53:08 »

Ti ringrazio davvero pray
Era da giorni che pensavo ad una soluzione.
Me lo studierò attentamente!
Grazie ancora
Logged
Turing
Matricola
*
Offline Offline

Gender: Male
Posts: 22



« Reply #5 on: 21-11-2011, 22:27:46 »

io ho provato a farlo...dovrebbe funzionare!
Code:
public class Occorrenza2
{
public static void main(String arg[])
{
int a[]={1,2,2,2,1,1,2},b[]={1,2,3,4},i=0,j,count=1,x=0,max=0;
char array='A';
while(i<a.length)
{
j=i+1;
count=1;
while(j<a.length)
{
if(a[i]==a[j])
{
count++;
}
if(count>max)   
{
max=count;
x=a[i];
}
j++;
}
i++;
}
i=0;
while(i<b.length)
{
j=i+1;
count=1;
while(j<b.length)
{
if(b[i]==b[j])
{
count++;
}
if(count>max)   
{
max=count;
x=b[i];
array='B';
}
j++;
}
i++;
}
if(x!=0)
{
System.out.println("il numero ripetuto piu' volte è "+x+", con occorrenze pari a "+max);
System.out.println("inoltre il numero si trova nell'array "+array);
}
else System.out.println("ogni elemento ha occorrenza pari a 1");
}
}
« Last Edit: 23-11-2011, 23:53:57 by Turing » Logged
frankielee
Matricola
*
Offline Offline

Gender: Female
Posts: 15



« Reply #6 on: 21-11-2011, 22:43:37 »

Devo studiare per bene anche questo,sono un pò lenta a capire boh
Ti ringrazio tanto yoh
Logged
Pages: [1]   Go Up
Print
Jump to: