2012-03-31 4 views
-2

Angesichts der Array muss ich finden, wie viele monoton steigende Sub-Arrays gibt es in diesem Array?Finden Sie Zahlen von monoton steigenden Sub-Array

Zum Beispiel mit [0, 1, 3, 1, 2] - hat 2 monotone Sub-Arrays: [0, 1,3] und [1,2].

public class SUB_ARRAY { 
    public static void main(String a[]){ 
     int[] x = new int[6]; 
     x[0]=1; 
     x[1]=2; 
     x[2]=3; 
     x[3]=6; 
     x[4]=9; 
     x[5]=10; 
     ArrayList<Object> arraylist = new ArrayList<Object>(); 
     HashSet list = new HashSet(); 
     for (int i=0; i< (x.length -1); i++){ 
      if (x[i+1]> x[i]){ 
       list.add(x[i]); 
       list.add(x[i+1]); 

      } else if (x[i+1] < x[i] || x[i+1]==x[i]) { 
       arraylist.add(list.clone());  
       list.clear();  
      } 
     }  
     System.out.println(arraylist.size()); 

    }  
} 

Der Ausgang ist: 0 (statt 1).

Also, wo liege ich falsch?

+2

Warum verwenden Sie einen HashSet (und warum geben ihm den Namen "Liste"?)? Warum die ArrayList? Warum nicht einfach eine einfache Zählervariable verwenden? Und warum nach 108 Posts hier ist dein Code alle linksbündig formatiert? –

+1

Vote um zu schließen: Fremde zu fragen Fehler in Ihrem Code durch Inspektion zu erkennen ist nicht produktiv. Sie sollten das Problem identifizieren (oder zumindest isolieren), indem Sie einen Debugger oder Druckanweisungen verwenden, und dann mit einer spezifischeren Frage zurückkommen. –

+0

@ Hovercraft voll von Aalen: HashSet - Ursache doppelte Zahl ist nicht erlaubt, nur der falsche Name .. ArrayList, um Zahlen von HashSet zu zählen. Sorry über das Format .. –

Antwort

1

Überprüfen Sie diese Lösung. Es zeigt jetzt nur den Zähler an, druckt aber die Subarrays. Wenn Sie nur die fortlaufenden Subarrays benötigen, können Sie diese einfach ändern.
Wie Sie sehen, verwende ich weder HashSet noch ArrayList zum Speichern temporärer Daten nur einen Zähler.

import java.util.ArrayList; 
public class SUB_ARRAY{ 
    public static int SUBARRAY_MINIMUM_LENGTH = 2; 
    public static void main(String a[]){ 
     ArrayList<Integer> x = new ArrayList<Integer>(); 
     x.add(5); 
     x.add(0); 
     x.add(1); 
     x.add(3); 
     x.add(4); 
     x.add(2); 
     x.add(3); 
     x.add(6); 
     x.add(1); 
     x.add(0); 
     x.add(4); 
     int monoton = 0; 
     int changed = -1; 
     System.out.println("Initial array: " + x.toString()); 
     for (int i=0; i< x.size() -1; ++i){ 
      if (x.get(i+1) > x.get(i)){ 
       if (changed > -1){ 
        for (int j = changed; j <i+2; ++j){ 
         monoton += checkSubArray(x, j, i+2);; 
        } 
       } 
       else{ 
        System.out.println("New monoton subarray start index: " + i + " value: " + x.get(i)); 
        changed = i; 
        monoton += checkSubArray(x, changed, i+2); 
       } 
      } 
      else if (changed > -1){ 
       changed = -1; 
      } 
     }  
     System.out.println("Monoton count: " + monoton); 
    }  

    private static int checkSubArray(ArrayList<Integer> x, int start, int end) 
    { 
     if (end-start < SUBARRAY_MINIMUM_LENGTH){ 
      return 0; 
     } 
     for (int subi = start; subi < end; ++subi){ 
      System.out.print(" " + x.get(subi)); 
     } 
     System.out.println(); 
     return 1; 
    } 
} 

Die Ausgabe wird der folgende

 
Initial array: [5, 0, 1, 3, 4, 2, 3, 6, 1, 0, 4] 
New monoton subarray start index: 1 value: 0 
0 1 
0 1 3 
1 3 
0 1 3 4 
1 3 4 
3 4 
New monoton subarray start index: 5 value: 2 
2 3 
2 3 6 
3 6 
New monoton subarray start index: 9 value: 0 
0 4 
Monoton count: 10 
+1

Bitte versuchen Sie den Code zu verstehen, nicht nur kopieren + verwenden Sie es, wenn es für Sie in Ordnung ist. – dexametason

Verwandte Themen