簡體   English   中英

C#在不使用sort()或reverse()的情況下反轉字符串數組

[英]C# Reverse a string array without using sort( ) or 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.

任何想法,將不勝感激。

您缺少交換。 您可以使用數組的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;                    
}

有很多方法可以做到這一點。

首先,您可以使用遞歸。 在類似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時會發生什么。 另外,您確實需要交換元素。

您正在將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

在表的一半之后,您要交換已交換的元素。 正確的解決方案是:

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

希望這個答案有意義,如果您不了解泛型,則可以用字符串替換T end變量從末尾starts從數組的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;
}

有時我想知道為什么代碼看起來比應該的難。 試試`

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM