反转字符串、数组

Reverse String, Array

C# code for reversing a string

这部分我没看懂

arr[name.Length - i] = name[i - 1];

让我们有 5 个字符的 name。所以 arr 的值将是 4,对吗?

然后在循环中,循环变量也取相同的长度,所以它的初始值也将是4。

在第一次迭代中,arr[4 - 4]的值将是arr[0]name[4 - 1]将是name[3],所以arr的第一个索引是用 name.

的第四个索引复制

原来的名字在arr中是如何倒序存储的?

static void Main(string[] args)
        {
            Console.Write("What is your name: ");
            var name = Console.ReadLine();

            var arr = new char[name.Length];

            for (var i = name.Length; i > 0; i--)
                arr[name.Length - i] = name[i - 1];

            var reversed = new string(arr);
            Console.WriteLine(reversed);
        }

我在这里复制了原始代码的图像。

using System;
                    
public class Program
{
    public static void Main()
    {
        Console.WriteLine("What is your name? ");
        string name = Console.ReadLine();
        var arr = new char[name.Length];
        
        for (var i = name.Length; i > 0; i--){
            arr[name.Length -1] = name[i-1];
        }
        var reversed = new string(arr);
        Console.WriteLine(reversed);
        
    }
}

索引似乎有点偏离。您想要获取您输入的名称的长度(名称的末尾),并将字符从末尾开始返回到单词的开头。下面我更改了一些变量名,为代码添加更多含义。

public static void CorrectedMain()
    {
        Console.WriteLine("What is your name? ");
        string name = Console.ReadLine();
        
        char[] reversedLetters = new char[name.Length];
        for (var i = name.Length; i > 0; i--){
            reversedLetters[i-1] = name[name.Length -i ];
        }
        var reversed = new string(reversedLetters);
        Console.WriteLine(reversed);
    }

如果您在第一个块中输入 Thomas,您将得到 T,如果您 运行 在第二个块中输入代码,您将得到 samohT。

这是其中的一个 fiddle。 https://dotnetfiddle.net/txwyd1

回答你的问题:字符串和数组是零索引的。 IE。第一个元素位于索引 0。最后一个元素位于 Length - 1。

你例子中的代码写得不是很好。它打破了一些基本的编码原则。

  1. 迭代向前,除非有非常具体的需要向后移动。在这种情况下,没有。
  2. 在执行涉及字符串和数组的任何代码时使用从零开始的变量。

这个例子打破了这两个,我认为这是它难以阅读的部分原因,但让我们试试。

查看迭代,如果 Length 如您所建议的那样为 5,则 i 从 5 开始并下降到 1。当 i 为 5 时:(name.Length - i) = 0,并且 i - 1 = 4,所以数组索引0(数组中的第一个)得到位置4的字符(即第5个字符)。

在下一次迭代中,i 为 4:(name.Length - i) = 1,并且 i - 1 = 3,因此数组索引 1(数组中的第二个)获取位置处的字符3(第 4 个字符)。

以此类推

这是同一算法的稍微好一点的版本。希望它更容易阅读。

public static void Main()
{
    Console.Write("What is your name: ");
    string name = Console.ReadLine();
    int n = name.Length;
    char[] arr = new char[n];
    for (int i = 0; i < n; i++)
        arr[i] = name[n - 1 - i];
    string reversed = new String(arr);
    Console.WriteLine(reversed);
}