2017-09-02 1 views
0

Ermitteln des maximalen Teilarrays von nicht negativen Zahlen aus einem Array. Das Sub-Array sollte kontinuierlich sein. Das heißt, ein Unterfeld, das durch Auswahl des zweiten und vierten Elements und Überspringen des dritten Elements erstellt wurde, ist ungültig.Segmentierungsfehler (Vektordeklaration)

Das maximale Sub-Array wird durch die Summe der Elemente im Sub-Array definiert. Unterfeld A ist größer als Unterfeld B, wenn Summe (A)> Summe (B).

Dies ist meine Lösung:

vector<int> Solution::maxset(vector<int> &A) { 
// Do not write main() function. 
// Do not read input, instead use the arguments to the function. 
// Do not print the output, instead return values as specified 
// Still have a doubt. Checkout www.interviewbit.com/pages/sample_codes/ for more details 

    vector <int> bla; 
    int sum[100]={0}; 
    int k = 0; 
    int j = 1; 

    for (int i =0; i < A.size(); i++){ 
     if (A[i] > -1){ 
      sum[k] = A[i] + sum[k]; 
     } 
     else { 
      k++; 
     } 
    } 

    cout<<sum[0]<<" "; 
    cout<<sum[1]<<" "; 
    cout << sum[2] << " "; 

    int s = 0; 

    for (int i =0; i< 100; i++){ 
     if (s < sum[i]){ 
      s = sum[i]; 
      k = i; 
     } 
    } 

    cout << s; 

    int count = 0; 
    for (int i =0; i < A.size(); i++){ 
     if (A[i] < 0) { 
      count ++; 
     } 

     if (count == k) { 
      int j = i+1; 
      int x = 0; 
      while (A[j] > 0 && j< (A.size()-1)) { 
       // bla[x] = A[j]; 
       x++; 
       j++; 
      } 
     } 
    } 

    return bla; 
} 

Wenn ich die Linie bla Kommentar- [x] = A [j], ich Segmentierung Fehler. Kann jemand erklären, wie man diesen Fehler aufdeckt? Ich habe irgendwo gelesen, dass im Stapel nicht genug Platz ist. Ich verstehe nicht wie. Danke

+2

Jetzt ist die richtige Zeit ist, zu lernen, wie man einen Debugger verwenden. Übrigens, dein Code ist fehlerhaft. – WhiZTiM

+2

Wenn Sie einen Vektor ohne eine bestimmte Größe definieren, ist er * leer *. Jede Indizierung in diesem wird * außerhalb der Grenzen * sein. –

+0

@Someprogrammerdude dann, wie ordne ich einem Vektor Werte zu, wenn ich es nicht indizieren kann? –

Antwort

0

Sie können die Größe an ein Vektorobjekt übergeben oder Sie können den Standardkonstruktor aufrufen, der ein Vektorobjekt mit der Größe 0 erstellt.

std::vector<int> vecInt(10); 
for(int i(0); i < vecInt.size(); i++) 
    vecInt[i] = i; 

Oder Sie können einen Vektor mit Größe 0 deklarieren:

std::vector<int> vecInt; 
vecInt[0] = 10; // segfault 

Weil Sie versuchen, Werte zu speichern in einem nicht zugewiesenen Platz.

Um ein solches Problem Verwendung push_back zu speichern zu lösen und pop zu löschen:

So Ihr Beispiel wie folgt sein:

while (A[j] > 0 || j< (A.size()-1)) { 
    // bla[x] = A[j]; 
    bla.push_back(A[j]); 
    x++; 
    j++; 
} 
+1

Hinweis: Im Gegensatz zu dem Kommentar in Code wird der zweite von diesen * nicht * seg-fault, da der Schleifenkörper niemals eingegeben wird. 'vecInt.size()' wird Null sein, und als solches wird 'i WhozCraig

+0

@WhozCraig: Ja danke! Du hast recht. Das habe ich nicht wirklich bemerkt. – Raindrop7