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.
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.
Właśnie nad takim czymś myślałem ale wolałbym(jeżeli to możliwe) zrobic to bez dodatkowych zmiennych.
Regex.Replace z MatchEvaluatorem który odwraca słowa. Bo czemu nie robić wszystkiego regexami :D
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();
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.
.ToCharArray(TwójString);
A potem to sobie wyświetl w pętli tak jak ci się podoba. Od tyłu, od przodu, od środka.
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
//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.
A mógłby ktoś bardziej "łopatologicznie" krok po kroku objaśnić :
var ouput = input.Split(' ').Select(x => reverse(x)).ToArray();
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()).