C++ :: Aufgabe #368

1 Lösung Lösung öffentlich

String abwechselnd neu anordnen

Anfänger - C++ von JKooP - 15.05.2021 um 10:48 Uhr
Gegeben ist ein String (Text) bestehend aus Kleinbuchstaben und Ziffern.
Ziel ist es diesen String neu anzuordnen, sodass sich Kleinbuchstaben und Ziffern abwechseln.
D.h., auf einen Kleinbuchstaben darf kein Kleinbuchstabe und auf eine Ziffer keine weitere Ziffer folgen.
Die Reihenfolge der Zeichen-Gruppen (Kleinbuchstaben bzw. Ziffern) darf nicht verändert werden.
Sind beide Zeichengruppen gleich lang, ist es egal mit welchem Zeichen begonnen wird.
Gibt es keine Lösung, soll ein Leer-String zurückgegeben werden.

Beispiele:
s = "train1234"
Lösung: "t1r2a3i4n"

s = "1234567"
Lösung: "", da nur Ziffern

s = "abcdefg"
Lösung: "", da nur Buchstaben

s = "abcdef123"
Lösung: "", nicht abwechselnd möglich

s = "abcd1234"
Lösung: "a1b2c3d4" oder "1a2b3c4d"

Schreibe eine Methode/Funktion, die obige Aufgabenstellung umsetzt.

Viel Spaß

Lösungen:

vote_ok
von JKooP (18070 Punkte) - 19.07.2021 um 08:10 Uhr
C++ 17
Quellcode ausblenden C-Code
#include <iostream>
#include <string>
#include <vector>

int count_chars(std::string s, char begin, char end) {
    int c{ 0 };
    for (const auto& i : s)
        if (i >= begin && i <= end)
            c++;
    return c;
}

std::string ordered_sequence(std::string s) {

    std::vector<char>v(s.size());
    auto nc{ count_chars(s, 'a', 'z') };
    auto nd{ count_chars(s, '0', '9') };
    auto cc{ 0 };
    auto cd{ 0 };

    if (abs(nc - nd) > 1) return "LEER";
    if (nc > nd)
        cd = 1;
    else
        cc = 1;

    for (const auto& i : s) {
        if (i >= 'a' && i <= 'z') {
            v[cc] = i;
            cc += 2;
        }
        else {
            v[cd] = i;
            cd += 2;
        }
    }
    std::string t(v.begin(), v.end());
    return t;
}

int main()
{
    std::vector<std::string>v{ "train1234", "1234567", "abcdefg", "abcdef123", "abcd1234" };
    for(const auto& i : v)
        std::cout << ordered_sequence(i) << "\n";
}