在C#中不使用String.Split反转句子的单词

gee*_*ran 1 .net c# string algorithm

最近我在讨论中被要求写一个算法来实现一个句子的单词的反转(不是整个句子的反转),而不使用除了ToCharArray和Length之外的字符串操作,如Split/Replace/Reverse/Join.以下是我在5分钟内设计的内容.虽然算法工作正常,但似乎有点丑陋的实现方式.有些人可以通过抛光代码来帮助我.

string ReverseWords(string s)
{
    string reverseString = string.Empty;
    string word = string.Empty;

    var chars = s.ToCharArray();
    List<ArrayList> words = new List<ArrayList>();
    ArrayList addedChars = new ArrayList();
    Char[] reversedChars = new Char[chars.Length];
    int i = 1;
    foreach (char c in chars)
    {
        if (c != ' ')
        {
            addedChars.Add(c);
        }
        else
        {
            words.Add(new ArrayList(addedChars));
            addedChars.Clear();
        }
        if (i == s.Length)
        {
            words.Add(new ArrayList(addedChars));
            addedChars.Clear();
        }
        i++;
    }
    foreach (ArrayList a in words)
    {
        for (int counter = a.Count - 1; counter >= 0; counter--)
        {
            reverseString += a[counter];
        }
        if(reverseString.Length < s.Length)
            reverseString += " ";
    }
    return reverseString;
}
Run Code Online (Sandbox Code Playgroud)

mjv*_*mjv 7

存在一个相对其使用LIFO堆栈优雅的解决方案.
然而问题听起来像家庭作业,所以我只提供伪代码.

currWord = new LIFO stack of characters
while (! end of string/array)
{
  c = next character in string/array
  if (c == some_white_space_character) {
     while (currWord not empty) {
       c2 = currWord.pop()
       print(c2)
     }
     print(c)
  }
  else
    currWord.push(c)
}
Run Code Online (Sandbox Code Playgroud)


Uth*_*raj 5

这有点简单:

string inp = "hai how are you?";
StringBuilder strb = new StringBuilder();
List<char> charlist = new List<char>();
for (int c = 0; c < inp.Length; c++ )
{

    if (inp[c] == ' ' || c == inp.Length - 1)
    {
        if (c == inp.Length - 1)
            charlist.Add(inp[c]);
        for (int i = charlist.Count - 1; i >= 0; i--)
            strb.Append(charlist[i]);

        strb.Append(' ');
        charlist = new List<char>();
    }
    else
        charlist.Add(inp[c]);
}
string output = strb.ToString();
Run Code Online (Sandbox Code Playgroud)