在不使用c#中的split和substring等内置函数的情况下反转字符串中的单词

本文关键字:情况下 函数 单词 字符串 内置 中的 substring split | 更新日期: 2023-09-27 18:11:21

我写了以下内容:

    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"作为输出。我想要"世界你好"。

在不使用c#中的split和substring等内置函数的情况下反转字符串中的单词

我写了一个使用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#。

在伪代码中,这个问题的解决方案可能看起来像这样:

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

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

你需要稍微调整一下以使单词之间的空格正确

不能使用"内置"函数并不意味着不能编写自己的函数。你应该从这样的任务中学到的是如何把一个问题分解成一组子问题。

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>