【问题标题】:Reverse String, Array [closed]反向字符串,数组[关闭]
【发布时间】:2021-01-16 03:06:06
【问题描述】:

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);
        }

【问题讨论】:

  • 请将您的代码作为文本,而不是图像。您是否已在调试器中单步执行您的代码以查看发生了什么?
  • 包含的代码为文本@LanceU.Matthews
  • 这看起来是一种奇怪的做法。通常最好向前迭代而不是向后迭代(除非有特定需要)。在处理数组等时,也尽量使用从零开始而不是从 1 开始的值。即您的迭代器变量 i 应该介于 0 和 name.Length - 1 之间(而不是 name.Lenght 为 1)。做这些事情会让代码更简单,更容易阅读。
  • 在 for 循环的每次迭代中打印字符 arr[name.Length - i]name[i - 1],您将了解在反转字符串时到底发生了什么。如果这不能给您答案,请详细说明您的问题
  • 你的代码有效吗?如果是这样,您是否逐行、逐个字符地遍历它?如果您这样做,您的问题将得到解答。如果它不起作用,我希望您有一个或多个 Off by one 错误;这就是在这样的代码中发生的事情

标签: c# arrays string reverse


【解决方案1】:

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

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。

这里是它的一个小提琴。 https://dotnetfiddle.net/txwyd1

【讨论】:

    【解决方案2】:

    回答您的问题:字符串和数组是零索引的。 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多