C#不使用sort()或reverse()反转字符串数组

时间:2015-04-20 21:13:41

标签: c# arrays string algorithm reverse

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

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.

任何想法都会受到赞赏。

6 个答案:

答案 0 :(得分:4)

您缺少交换。你可以用一半的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;                    
}

答案 1 :(得分:2)

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

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

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

接下来是就地逆转;几乎你已经完成的工作,除了你的for循环是它需要的两倍大。查看将循环的某个部分更改为start < sArray.Length / 2时会发生什么。另外,您确实需要交换元素。

答案 2 :(得分:0)

您正在将HALF之后的项目重写为上半年。试试这个:

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

答案 3 :(得分:0)

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

    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 + ",");
    }

答案 4 :(得分:0)

希望这个答案有意义,如果您不了解泛型,可以用字符串替换Tend变量从结尾开始,starts从数组的前面开始,它们逐渐靠近彼此,直到它们指向相同的元素(对于奇数大小的数组)或结束指针指向在开始指针之前(对于偶数大小的数组),在任何一种情况下start < 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 :(得分:0)

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

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。