【问题标题】:C# Reverse a string array without using sort( ) or reverse( )C# 在不使用 sort( ) 或 reverse( ) 的情况下反转字符串数组
【发布时间】:2015-04-20 21:13:40
【问题描述】:

您好,我正在尝试编写一种方法,该方法将反转调用的字符串数组。我完成了我的代码,但只得到了一半的数组反转,其余的保持不变,被困在这几个小时。所以我不得不在堆栈上询问作为最后的手段。

int start;
string[] sArray = {
    "Reverse", "this", "string", "type", "array"
};
int end = (sArray.Length - 1);
for (start = 0; start < sArray.Length; start++) {
    sArray[start] = sArray[end - start];

    Console.Write(sArray[start] + ",");
}

//  The output supposed to be : array type string this Reverse
// However, I keep getting array type string type array.
//  The output supposed to be : array type string this Reverse
// However, I keep getting array type string type array.

任何想法都将不胜感激。

【问题讨论】:

  • 你没有交换任何元素,只是将一个元素分配给另一个元素,这就解释了为什么它不交换。

标签: c# arrays string algorithm reverse


【解决方案1】:

您缺少交换。你可以用数组 len 的一半来做到这一点:

string[] sArray = { "Reverse", "this", "string", "type", "array" };

for (int start = 0; start < sArray.Length/2; start++ )
{
     var temp = sArray[start];
     sArray[start] = sArray[sArray.Length - 1 - start];
     sArray[sArray.Length - 1 - start] = temp;                    
}

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点。

    首先,您可以使用递归。在类似 C# 的伪代码中,这将如下所示:

    T[] Reverse<T>(T[] input)
    {
        if(input.Length <= 1) return input;
        return Reverse(input[0..input.Length - 1]) + input[..input.Length];
    }
    

    Next 是原地反转;几乎你已经完成了,除了你的 for 循环是它需要的两倍大。看看当你将循环的一部分更改为start &lt; sArray.Length / 2 时会发生什么。另外,您确实需要交换元素。

    【讨论】:

      【解决方案3】:

      您正在将半场之后的项目改写到上半场。试试这个:

      int start;
      string[] sArray = { "Reverse", "this", "string", "type", "array" };
      string[] temp = new string[sArray.Length];
      int end = (sArray.Length-1);
      for (start = 0; start < sArray.Length; start++ )
                  {
                      temp[start] = sArray[end - start];
      
                      Console.Write(sArray[start]+",");
                  }
      sArray = temp; // putting back to the original varible
      

      【讨论】:

        【解决方案4】:

        希望这个答案有意义,如果您不了解泛型,可以将T 替换为字符串。 end 变量从末尾开始,starts 从数组的前面开始,它们彼此靠近,直到它们指向同一个元素(对于奇数大小的数组)或结束指针指向前面的某个元素开始指针(对于偶数大小的数组),在任何一种情况下,start &lt; end 都会返回 false,并且循环将停止。

        private static void Reverse<T>(T[] items)
        {
            for (int start = 0, end = items.Length - 1; start < end; start++, end--)
            {
                Swap(items, start, end);
            }
        } 
        
        private static void Swap<T>(T[] items, int a, int b)
        {
            var help = items[a];
            items[a] = items[b];
            items[b] = help;
        }
        

        【讨论】:

          【解决方案5】:

          在表格的一半之后,您正在交换已经交换的元素。 正确的解决方案是:

              static void Reverse()
              {
                  string[] sArray = { "Reverse", "this", "string", "type", "array" };
                  int end = sArray.Length - 1;
                  for (int start = 0; start < (sArray.Length / 2); ++start)
                  {
                      string tmp = sArray[start];
                      sArray[start] = sArray[end - start];
                      sArray[end - start] = tmp;
                  }
          
                  foreach (var s in sArray)
                      Console.Write(s + ",");
              }
          

          【讨论】:

            【解决方案6】:

            有时我想知道为什么代码看起来比它应该的更难。试试`

            string[] words = new string[] {"reverse", "this", "string", "type", "array"};
            string[] reverse = new string[words.Length];
            int start = 0;`
            
            for(int i = words.Length - 1; i >= 0; i--){
                reverse[start] = words[i];
                s++;
            }
            
            foreach(string s in reverse){
                Console.Write(s + ", ");
            }
            

            希望这会有所帮助 =) 或在 for 循环中使用另一个 for 循环,而不是使用 start。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-12-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多