Warum wird Müll angezeigt?

Aug 28 2020

Der Benutzer gibt eine Zeichenfolge wie '3 + 2 + 1' oder '1 + 3 + 2 + 1 + 3 + 1' ein. Und ich muss nur die Zeichenfolge sortieren. Nach 4-5 Testfällen tritt jedoch ein Fehler auf.

Input  - 2
Output - �

Input  - 2+1+2+2+2+3+1+3+1+2
Output - �+1+1+1+2+2+2+2+2+3
#include<iostream>
using namespace std;

int main()
{

    string s;
    cin>>s;

    for(int i=0;i<s.size();i+=2)
    {
        for(int j=0;j<(s.size()-i);j+=2)
        {
            if(s[j]>s[j+2])
            {
                swap(s[j],s[j+2]);
            }
        }
    }

    cout<<s;
    return 0;
}

Antworten

2 Injourn Aug 28 2020 at 13:01

Wie Ggorlen sagte, wird Müll angezeigt, weil Sie auf einen Wert zugreifen, der außerhalb der Grenzen liegt. Überprüfen Sie, ob Ihr "j" -Index plus 2 außerhalb der Grenzen liegt, bevor Sie einen Swap durchführen.

#include<iostream>
using namespace std;

int main()
{

    string s;
    cin>>s;

    for(int i=0;i<s.size();i+=2)
    {
        for(int j=0;j<(s.size()-i);j+=2)
        {
            if(j+2 < s.size() && s[j]>s[j+2])
            {
                swap(s[j],s[j+2]);
            }
        }
    }

    cout<<s;
    return 0;
}

Eingang 2+1+2+2+2+3+1+3+1+2

Ausgabe 1+1+1+2+2+2+2+2+3+3

NiteLite Aug 28 2020 at 13:11

Der Wert von j geht außerhalb der Grenzen. Versuchen Sie es mit der Einfügesortierung:

#include <bits/stdc++.h>
using namespace std;

void insertionSort(string s)
{
    int key, j; 
    for (int i = 1; i < s.size(); i++) 
    { 
        key = s[i]; 
        j = i - 1; 
        while (j >= 0 && s[j] > key) 
        { 
            s[j + 1] = s[j]; 
            j = j - 1; 
        } 
        s[j + 1] = key; 
    } 
    for (int i = 0; i < s.size(); i++) 
        cout << s[i] << " "; 
    cout << endl; 
}

int main() 
{ 
    string s;
    cin>>s;
    insertionSort(s); 

    return 0; 
}

Ich hoffe, Sie verstehen den Code.