|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Sep 2007
Messaggi: 45
|
[JAVA] La Bandiera Tricolore
Salve a tutti,
volevo proporvi un classico degli esercizi che si svolgono in un corso di programmazione java... Dato un array di interi, si crei un metodo void bandiera(int [] a) che suddivida tale array in tre parti senza usare array di appoggio. una parte con gli int che %3 danno resto 0, un'altra con quelli che danno resto 1 e la restante con quelli che danno resto 2. Dovendo realizzare un metodo boolean testBandiera(int[] a) che verifichi la reale suddivisione dell'array nelle tre parti sopracitate, come lo fareste? a me per ora non vengono in mente soluzioni brillanti... a voi la parola ! e grazie preventivamente dell'aiuto |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Dico bene?
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2005
Messaggi: 1653
|
Quote:
__________________
gica78r@ncc-1701:~$ tar -c tar: Codardamente mi rifiuto di creare un archivio vuoto |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Io risolverei così
Codice:
public class Bandiera{
public static void bandiera(int[] a){
bandiera(a,0);
}
private static void bandiera(int[] a,int index){
if (index==a.length) return;
else{
if (a[index]%3==0) mettiSinistra(a,index);
if (a[index]%3==2) mettiDestra(a,index);
bandiera(a,index+1);
}
}
private static void mettiDestra(int[] a,int index){
int temp=a[a.length-1];
a[a.length-1]=a[index];
a[index]=temp;
}
private static void mettiSinistra(int[] a,int index){
int temp=a[0];
a[0]=a[index];
a[index]=temp;
}
public static boolean testBandiera(int[] a){
return testBandiera(a,0,0);
}
private static boolean testBandiera(int[] a,int index,int mode){
if (a.length==index) return true;
else
if (mode==3) return false;
else{
return a[index]%3==mode && (testBandiera(a,index+1,mode) || testBandiera(a,index+1,mode+1));
}
}
}
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque io ho solo fatto una domanda/precisazione e l'unico che può rispondere/confermare è life_is_a_bitch. Per me potrebbe andare bene tanto la "mia" specifica quanto la "tua".
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
|
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Quote:
EDIT:Hai ragione, dovrei fare uno scalamento progressivo su tutti gli elem dell'array EDIT2: Ecco la versione corretta (spero) Codice:
public class Bandiera{
public static void bandiera(int[] a){
bandiera(a,0);
}
private static void bandiera(int[] a,int index){
if (index==a.length) return;
else{
if (a[index]%3==0) mettiSinistra(a,index);
if (a[index]%3==2) mettiDestra(a,index);
bandiera(a,index+1);
}
}
private static void mettiDestra(int[] a,int index){
int temp=a[index];
for (int i=a.length-1;i>index;i--)
a[i-1]=a[i];
a[a.length-1]=temp;
}
private static void mettiSinistra(int[] a,int index){
int temp=a[index];
for (int i=0;i<index;i++)
a[i+1]=a[i];
a[0]=temp;
}
public static boolean testBandiera(int[] a){
return testBandiera(a,0,0);
}
private static boolean testBandiera(int[] a,int index,int mode){
if (a.length==index) return true;
else
if (mode==3) return false;
else{
return a[index]%3==mode && (testBandiera(a,index+1,mode) || testBandiera(a,index+1,mode+1));
}
}
}
Ultima modifica di morskott : 26-10-2007 alle 19:33. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2780
|
Io farei una specie di bubble sort:
inizia la ricerca, se trovo un %3=0 lo porto su finchè non trovo la cima o un altro %3=0, se trovo un %3=1 lo porto su finchè non trovo un %3=1 o un %3=0 o la cima, se trovo un %3=2 lo lascio dov'è... E per la verifica basta scorrere l'array, se trovo blocchi di numeri dello stesso tipo in posti differenti allora ritorno false |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Innanzitutto premetto che come "specifiche" mi va anche bene quando detto da Gica78R, cioè che non ci siano vincoli sulla lunghezza dell'array o sulla ripartizione dei valori.
Detto questo mi permetto di postare la "mia" versione: Codice:
import java.util.*;
public class Prova
{
public static void main (String[] args)
{
int[] arr;
arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
System.out.println ("prima: " + Arrays.toString (arr));
bandiera (arr);
System.out.println ("dopo: " + Arrays.toString (arr));
arr = new int[] { 3, 2, 4, 6, 9, 8, 10 };
System.out.println ("prima: " + Arrays.toString (arr));
bandiera (arr);
System.out.println ("dopo: " + Arrays.toString (arr));
}
public static void bandiera (int[] a)
{
for (int i=0, k=0; i < 3; i++)
{
for (int j=k; j < a.length; j++)
{
if (a[j] % 3 == i)
{
int t = a[k];
a[k++] = a[j];
a[j] = t;
}
}
}
}
}
Codice:
prima: [0, 1, 2, 3, 4, 5, 6, 7, 8] dopo: [0, 3, 6, 1, 4, 7, 2, 5, 8] prima: [3, 2, 4, 6, 9, 8, 10] dopo: [3, 6, 9, 4, 10, 8, 2] L'unica cosa è che non è "stable" cioè non mantiene l'ordine relativo degli elementi (si noti che nel secondo test 2 e 8 vengono scambiati come ordine). Se lo volete "stable", beh, ci debbo pensà.....
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
per renderlo stabile, la mia versione (verisone di moskott modificata) risulta stabile se l'inserimento a destra inserisce nell'ultima posizione, mentre l'inserimento a sinistra inserisce a destra dell'area A, dove làarea A eà la parte sinistra dell'array e tale che i suoi elementi sono divisibili per 3 pero' a occhio la complessita' e' maggiore della tua soluzione |
|
|
|
|
|
|
#11 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
e perché? anche un array da 4 locazioni può essere diviso in tre parti, per esempio le prime due locazioni, la successiva, e la successiva ancora. piuttosto dovrebbe verificare che la lunghezza sia maggiore o uguale a 3.
Quote:
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Grazie.
Una implementazione "stable" si può fare in questo modo: Codice:
public static void bandiera (int[] a)
{
for (int i = 0; i < a.length-1; i++)
{
for (int j = i+1; j < a.length; j++)
{
int mi = a[i] % 3;
int mj = a[j] % 3;
if (mi > mj || (mi == mj && a[i] > a[j]))
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
Un esempio è questo: Codice:
prima: [9, 6, 10, 7, 4, 1, 14, 11, 5, 2] dopo: [6, 9, 1, 4, 7, 10, 2, 5, 11, 14] Calma ... era solo un mio "dubbio".
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:46.




















