反转字符串
本文关键字:字符串 | 更新日期: 2023-09-27 18:22:08
我刚刚在研究如何反转字符串。我在C#完整参考书中找到了一个程序,但我无法理解它。请告诉我它是如何工作的
程序在这里:
using System;
class RevStr
{
// Display a string backward.
public void DisplayRev(string str)
{
if(str.Length > 0)
DisplayRev(str.Substring(1, str.Length-1));
else
return;
Console.Write(str[0]);
}
}
class RevStrDemo
{
static void Main()
{
string s = "this is a test";
RevStr rsOb = new RevStr();
Console.WriteLine("Original string: " + s);
Console.Write("Reversed string: ");
rsOb.DisplayRev(s);
Console.WriteLine();
}
}
- 这个程序是如何工作的
- 语句
rsOb.DisplayRev(s);
是否为字符串中的每个字符调用DisplayRev(str.Substring(1, str.Length-1));
我的建议
你试过myString.Reverse();
吗
这将是在C#(.Net 3.5及更高版本)中反转字符串的最简单方法。
响应
对于您的示例,它使用Recursion
来显示每个字符,方法是删除结束字符(通过创建删除了第一个字符的原始字符串),然后再次调用它自己,直到没有剩余的字符为止。
您只需要调用DisplayRev(s);
一次,因为它递归地显示其中的每个字符。
解释尝试
例如,我们有字符串"hello"
。
第一个调用将递归调用具有"hello"
的substring
的函数,该函数将是"ello"
请注意,尚未对Console.WriteLine进行调用,因为已经调用了函数DisplayRev
,因此我们将介入递归调用
这种情况将持续发生,直到字符串为空(.Length == 0
)。然后,该函数将退出并返回给调用者,这将是字符串[0]为"o"的地方,Console.WriteLine
代码将被击中,将"o"写入控制台,然后该函数将被退出,该函数的调用者将被击中Console.WriteLine
,即"l",这将一直返回,直到到达初始调用。
从而产生你的初始字符串,反转。
参考
有很多关于递归的教程。以下是一些(他们会比我更善于解释):
递归示例1
递归示例2
否。
它使用递归调用
DisplayRev称自己少了一个字符
当它到达末尾,并从递归返回时,它将打印char。
还请注意,它只是显示被反转的字符串,而而不是实际上将其反转为
在类中,里面发生了什么。仔细阅读
看到Sub-string函数正在用两个参数调用。
- 是字符串的长度[这里只有一个字符]
- 字符串中的位置
然后它打印那个字符。它是一个递归调用,所以它一直发生到字符串长度为非零
这是对同一函数的递归调用。
基本上,它依赖于这样一个事实,即Console.Write
命令直到上一次对DisplayRev
的调用返回后才被调用。
每个对DisplayRev的调用都会传递一个字符串,该字符串已删除第一个字符:对于
str = "abcdef"
str.Substring(1, str.Length-1)
给出"bcdef"
Console命令写入第一个字符(str[0])。
在处理最后一个DisplayRev调用时,str[0]为"f"。
然后,所有呼叫都会返回到第一个呼叫,并显示大量内容,例如:
Console.Write("f")
Console.Write("e")
Console.Write("d")
Console.Write("c")
Console.Write("b")
Console.Write("a")
为什么不使用字符串的内置功能?
string s = "123";
s = s.Reverse();
这个程序只是反向输出字符串,它不会以任何方式修改字符串。以下是它的工作原理——它是基于递归的。如果打印从位置1开始的第一个子字符串的反转(即str.substring(1,str.Length-1)),然后打印字符串的第一个字符,则整个字符串将反转。显然,该函数对于长度为1的字符串是正确的,之后您可以使用归纳法和上述观察结果证明,给定的函数将正确打印所有长度的反向字符串。
然而,如果你不坚持自己实现字符串,有一个内置的函数可以反转字符串:
str.Reverse();
进行试运行:
input string="这是一个测试";
递归反向函数名为:
public void DisplayRev(string str)
{
if(str.Length > 0)
DisplayRev(str.Substring(1, str.Length-1));
else
return;
Console.Write(str[0]);
}
带参数的堆栈调用如下:
DisplayRev("t") // ----> prints "t"
DisplayRev("st") // ----> prints "s" ----> complete string "ts"
DisplayRev("est") // ----> prints "e" ----> complete string "tse"
DisplayRev("test") // ----> prints "t" ----> complete string "tset"
DisplayRev(" test") // ----> prints " " ----> complete string "tset "
DisplayRev("a test") // ----> prints "a" ----> complete string "tset a"
DisplayRev(" a test") // ----> prints " " ----> complete string "tset a "
DisplayRev("s a test") // ----> prints "s" ----> complete string "tset a s"
DisplayRev("is a test") // ----> prints "i" ----> complete string "tset a si"
DisplayRev(" is a test") // ----> prints " " ----> complete string "tset a si "
DisplayRev("s is a test") // ----> prints "s" ----> complete string "tset a si s"
DisplayRev("is is a test") // ----> prints "i" ----> complete string "tset a si si"
DisplayRev("his is a test") // ----> prints "h" ----> complete string "tset a si sih"
DisplayRev("This is a test")// ----> prints "t" ----> complete string "tset a si siht"
反转字符串(最有效的算法):以下不处理UTF-16代理项对。
public static String reverse(String orig){
char[] s = orig.ToCharArray();
int n = s.Length;
int halfLength = n / 2;
for (int i = 0; i < halfLength; i++){
char temp = s[i];
s[i] = s[n - 1 - i];
s[n - 1 - i] = temp;
}
return new String(s);
}
很多人似乎都想这样做……一个巧妙的方法是使用Array。反向
将字符串传递给一个char数组,使用array。反转,然后将char数组作为字符串返回。
Public static string ReverseString(string str)
{
char[] arr = str.ToCharArray();
Array.Reverse(arr);
return new string(arr);}