在不使用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"作为输出。我想要"世界你好"。
我写了一个使用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>