反转字符串中的单词而不使用C#

时间:2015-09-06 15:56:56

标签: c# string reverse

我写了以下内容:

    class Program
    {
    public static void Main(string[] args)
    {

        string name = "Hello World"

        StringBuilder builder = new StringBuilder();
        for (int i = name.Length - 1; i >= 0; i--)
        {
            builder.Append(name[i]);
        }
        string newName =builder.ToString();

        Console.WriteLine(newName);

    }
}

我得到了" dlrow olleh"作为输出。我想要"世界你好"。

3 个答案:

答案 0 :(得分:0)

在伪代码中,此问题的解决方案可能如下所示:

result = empty string
last = input.length
for i from input.length - 1 to 0
    if input(i) is whitespace or i is 0
        for j from i to last - 1
           append input[j] to result
        last = i

这从字符串的后面开始,然后向后循环。当它找到一个空格(或者到达stirng的开头)时,它知道它找到了一个完整的单词并将其添加到列表中。变量last会跟踪添加的最后一个单词的开始位置。

你必须稍微调整一下才能得到正确的单词之间的空格。

答案 1 :(得分:0)

我写了一个使用2个循环的快速解决方案。 第一个循环从左到右迭代字符串。 当遇到空格(分隔一个单词)时,第二个循环开始。

第二个循环是从从右到左循环显示的单词。第二个循环不能从左到右,因为我们不知道单词将从何处开始(除非我们记得我们在哪里遇到了前一个空格)。因此,第二个循环从右到左遍历字符串,直到遇到空格(单词的开头),或者直到索引变为0(这是一个极端情况)。在第一个循环中可以观察到相同的角落情况。

这是:

String name = "Hello World";
StringBuilder builder = new StringBuilder();

for (int i = 0; i < name.length(); i++)
{
    char tmp = name.charAt(i);
    if(tmp == ' ' || i == name.length() - 1) {
        // Found a whitespace, what is preceding must be a word
        builder.insert(0,  ' ');
        for(int j = i - 1; j >= 0; j--) {
            if(i == name.length() - 1 && j == i - 1) {
                // Exceptional case (necessary because after the last word there is no whitespace)
                builder.insert(0, name.charAt(i));
            } 

            char curr = name.charAt(j);

            if(curr == ' ') {
                // We passed the beginning of the word
                break;
            }
            else if(j == 0) {
                builder.insert(0,  curr);
                break;
            }

            //builder.append(curr);
            builder.insert(0, curr);
        }
    }
}

String newName = builder.toString();
System.out.println(newName);

请注意,这是java代码,但将其转换为C#应该很简单。

答案 2 :(得分:0)

仅仅因为你不能使用“内置”功能,并不代表你不能自己编写。你应该从这样的任务中学到的是如何将问题分解为一系列子问题。

string Reverse(string pInput) {
   // iterate backwards over the input, assemble a new string, and return it
}

List<string> Split(string pInput, char pSplitOn) {
   // iterate forwards over the input
   // build up a new string until the split char is found
   // when it is found, add the current string to a list
   // and start the building string over at empty
   // maybe only add strings to the list if they aren't empty
   // (although that wouldn't preserve extra whitespace, which you may want)
   // make sure to add the end of the string since it probably
   // doesn't end with the split char
   // return the list
}

string Join(List<string> pWords, char pSeparator) {
   // build up a new string consisting of each of the words separated by the separator
}

string ReverseWords(string pInput) {
   // split the input on a space
   // for each "word" in the resulting list, reverse it
   // join the reversed words back together into one string, with spaces separating them
}

这假设您将遇到的唯一空格由空格组成。还假设您被允许使用List<T>