反转字符串

本文关键字:字符串 | 更新日期: 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();
    }
}
  1. 这个程序是如何工作的
  2. 语句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函数正在用两个参数调用。

  1. 是字符串的长度[这里只有一个字符]
  2. 字符串中的位置
    然后它打印那个字符。它是一个递归调用,所以它一直发生到字符串长度为非零

这是对同一函数的递归调用。

基本上,它依赖于这样一个事实,即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);}