Funkcja odwracająca kolejność znaków w każdym wyrazie w zdaniu.

0

Potrzebuje napisać funkcję jak w temacie, najlepiej z użyciem stosu. Sam napisałem na razie funkcje odwracającą kolejność ale z całym zdaniu. Nie za bardzo wiem jak ugryźć ten temat.

0

Można by podzielić całe zdanie na pojedyncze słowa, jeżeli masz je w stringu to (string.split) lub jakoś inaczej, dać je w jakąś tablice/kontener odwrócić każdemu kolejność Twoją metodą stworzyć z powrotem zdanie.

0

Właśnie nad takim czymś myślałem ale wolałbym(jeżeli to możliwe) zrobic to bez dodatkowych zmiennych.

0

Regex.Replace z MatchEvaluatorem który odwraca słowa. Bo czemu nie robić wszystkiego regexami :D

1
public static string reverse(string x)
{
    string output="";
    for (int i=x.Length-1; i>=0; i--)
    {
        output += x[i];
    }
    return output;
}
public static void Main(string[] args)
{
    string input="abc tes aaa";

    var ouput = input.Split(' ').Select(x => reverse(x)).ToArray();
    foreach (var c in ouput)
    {
        Console.WriteLine(c);
    }
}

Wynik:

cba
set
aaa

BTW

Czemu coś takiego mi nie działa?

var ouput = input.Split(' ').Select(x => Array.Reverse(x.ToCharArray())).ToArray();
0

Wersja całkowicie ręczna: idziesz po kolei po tablicy znaków, jak napotkasz spację odwracasz połowę od ostatniej spacji do aktualnej spacji. Powtarzasz do końca tablicy.

private static string ReverseWordByWord(string _sentence)
{
    var sentence = _sentence.ToCharArray();
    var i = 0;
    var j = 0;
    var prevj = 0;
    char c;

    while (j < sentence.Length)
    {
        while (j < sentence.Length && sentence[j] != ' ')
            j++;

        for (i = 0; i < (j - prevj) / 2; i++)
        {
            c = sentence[prevj + i];
            sentence[prevj + i] = sentence[j - i - 1];
            sentence[j - i - 1] = c;
        }

        j++;
        prevj = j;
    }

    StringBuilder sb = new StringBuilder();
    sb.Append(sentence);
    return sb.ToString();
}

Jeżeli chcesz użyć stosu, to zmień moje zamienianie znaków w tablicy na użycie stosu - wrzucenie wszystkich znaków na stos i zdjęcie z powrotem.

0
.ToCharArray(TwójString);

A potem to sobie wyświetl w pętli tak jak ci się podoba. Od tyłu, od przodu, od środka.

0
Ktos napisał(a):

Wersja całkowicie ręczna: idziesz po kolei po tablicy znaków, jak napotkasz spację odwracasz połowę od ostatniej spacji do aktualnej spacji. Powtarzasz do końca tablicy.

private static string ReverseWordByWord(string _sentence)
{
    var sentence = _sentence.ToCharArray();
    var i = 0;
    var j = 0;
    var prevj = 0;
    char c;

    while (j < sentence.Length)
    {
        while (j < sentence.Length && sentence[j] != ' ')
            j++;

        for (i = 0; i < (j - prevj) / 2; i++)
        {
            c = sentence[prevj + i];
            sentence[prevj + i] = sentence[j - i - 1];
            sentence[j - i - 1] = c;
        }

        j++;
        prevj = j;
    }

    StringBuilder sb = new StringBuilder();
    sb.Append(sentence);
    return sb.ToString();
}

Jeżeli chcesz użyć stosu, to zmień moje zamienianie znaków w tablicy na użycie stosu - wrzucenie wszystkich znaków na stos i zdjęcie z powrotem.

public static string Reverse(string test) {
    char[] charArray = test.ToCharArray();
    Array.Reverse(charArray);
    return new string(charArray);
}

:D

1
 //input
 string input = "abc tes bcv";

 //kod
 var ouput = string.Join(" " ,input.Split(' ').Select(str => str.ToCharArray()).Select(cTab => { Array.Reverse(cTab); return new string(cTab); }));
        
 //output to od razu string a nie jakieś tablice
 //cba set vcb

@WeiXiao bo Array.Reverse nie zwraca wartości tylko wykonuje operację bezpośrednio na przekazanej tablicy, jest typu void.

0

A mógłby ktoś bardziej "łopatologicznie" krok po kroku objaśnić :
var ouput = input.Split(' ').Select(x => reverse(x)).ToArray();

0

Bierze ciąg wejściowy, dzieli na tablicę względem spacji, dla każdego elementu z tablicy zmienia go na wynik funkcji reverse z tym elementem jako parametrem funkcji, po czym zwraca tablicę (bo operacje Select zwracają IEnumerable, dlatego do otrzymania tablicy niezbędna jest ToArray()).

1 użytkowników online, w tym zalogowanych: 0, gości: 1