Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143

    Lunghezza della sequenza maggiore

    Ciao a tutti, dovrei scrivere un programmino Java che, dato un array di interi, restituisca la lunghezza della più lunga sequenza consecutiva di numeri negativi o zero.
    Non so proprio da che parte iniziare, qualcuno mi aiuta?

    Inizierei così, ma forse è più conveniente un while...
    codice:
    public static int find(int[] a) {
       for(int i = 0; i < al.length; i++) {
          //...
       }
    }
    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da vfldj Visualizza il messaggio
    Ciao a tutti, dovrei scrivere un programmino Java che, dato un array di interi, restituisca la lunghezza della più lunga sequenza consecutiva di numeri negativi o zero.
    Non so proprio da che parte iniziare, qualcuno mi aiuta?
    Iniziando magari dal concetto, da precisare meglio, e magari con qualche esempio. Sequenza consecutiva di numeri negativi uguali o differenti? Negativi e zero li tratti indifferentemente, cioè contribuiscono entrambi ad "allungare" la sequenza oppure il passaggio da negativo a zero (o viceversa) azzera la sequenza?
    Senza conoscere queste finezze, il codice non serve ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Hai ragione, cercherò di essere più preciso:

    [ 1, 5, -6, 2, 0, -3, 0, -5, -5, -7, 10] --> 6 ovvero la lunghezza della sequenza 0, -3, 0, -5, -5, -7
    [ 0, -2, 1] --> 2 ovvero la lunghezza della sequenza 0, -2
    [ 5, 3, 1, 4 ] --> 0 perchè non ci sono nè 0 nè negativi

    Quindi i numeri negativi e gli 0 vengono considerati nello stesso modo.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ok, ora chiarissimo. Basta scansionare l'array in modo lineare una volta sola. Tieni almeno 2 variabili, un contatore "attuale" e un contatore "max". Prova a ragionarci. Non è per niente difficile. Non ti spiego tutto in dettaglio perché altrimenti è come se ti dessi il codice ... immagino sia un "esercizio", ci devi provare tu, ovviamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    OK, ora ci provo..

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Ho fatto questa semplice classe di prova e con alcuni input il risultato restituito è sbagliato..

    codice:
    public class Prova {
        
        public static void main(String[] args) {
    
    
            int[] a1 = {-1, 5, 3, 0, 1, 1, -3, 0, -5, 7, -1, 0};
            printArray(a1, "a1");
            System.out.println("Risultato: " + maxSeq(a1));
    
    
            int[] a2 = {1, 5, 3, 10, 1, 1, 3};
            printArray(a2, "a2");
            System.out.println("Risultato: " + maxSeq(a2));
    
    
            int[] a3 = {-1, -5, -3, 0, -1, -1, -3, 0, -5}; //non va
            printArray(a3, "a3");
            System.out.println("Risultato: " + maxSeq(a3));
    
    
            int[] a4 = {1, -5, -3, 10, 1, 1, -3, 0, -5, 7, -1, -20, -2};
            printArray(a4, "a4");
            System.out.println("Risultato: " + maxSeq(a4));
    
    
            int[] a5 = {1, -5, -3, 10, 1, 1, -3, 0, -5, 7, -1, -20, -2, 0, -6}; //non va
            printArray(a5, "a5");
            System.out.println("Risultato: " + maxSeq(a5));
    
    
        }
    
    
        public static int maxSeq(int[] a) {
            int max = 0;
            int att = 0;
            int l = a.length; //12
            int i = 0;
            while(i < l-1) {
                if(a[i] <= 0) {
                    att++;
                    if(!(a[i+1] <= 0)) {
                        max = att;
                        att = 0;
                    }
                    i++;
                }
                else {
                    i++;
                }
            }
            return max;
        }
    
    
        public static void printArray(int[] a, String name) {
            System.out.println();
            System.out.println();
            System.out.print(name + ": { ");
            for(int i = 0; i < a.length; i++) {
                System.out.print(a[i] + " ");
            }
            System.out.println("}");
        }
    
    
    }
    Più precisamente non va nel caso siano tutti negativi/zeri e nel caso ci siano dei numeri negativi/zero finali..

    Il primo caso ho capito perchè non restituisce il valore giusto, è dovuto dal fatto che non aggiorno "max", ma se la aggiornassi, allora non andrebbe più negli altri casi...

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Perché complicarsi la vita?

    La tua versione ha anche altri problemi. Ad esempio, se ci sono più sequenze tu restituisci sempre la lunghezza dell'ultima, indipendentemente dal fatto che effettivamente sia la più lunga.

    Questa è una versione modificata che dovrebbe gestire anche questo caso (non l'ho testata a fondo)

    codice:
    public static int maxSeq(int[] a) {
        int max = 0;
        int att = 0;
    
        for (int i = 0; i < a.length; i++) {
            if (a[i] <= 0) {
                att++;
            }
    
            if (a[i] > 0 || i == a.length - 1) {
                if (att > max) {
                    max = att;
                }
    
                att = 0;
            }
        }
    
        return max;
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Effettivamente il tuo codice è molto più semplice.. Grazie

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da vfldj Visualizza il messaggio
    Effettivamente il tuo codice è molto più semplice.. Grazie
    E il mio allora ancora di più:

    codice:
    public static int maxSeq(int[] a) {
        int max = 0;
        int att = 0;
        
        for (int i = 0; i < a.length; i++) {
            if (a[i] <= 0) {
                if (++att > max) {
                    max = att;
                }
            } else {
                att = 0;
            }
        }
        
        return max;
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.