0

C# で元の要素を特定の順序で残しながら、配列内の 1 つの要素を毎回右にシフトしたいと考えています。

わかりましたので、理由を理解できるコードを書き直すように求められました。

番号は 48390 かもしれません

    //the ar elements have been commented out to show that we never know what ar contains but only the that I will always want to shift; ar[4]
    int[] ar = new int[5];
    //ar[0] = 4
    //ar[1] = 8
    //ar[2] = 3
    //ar[3] = 9
    //ar[4] = 0
    while(ar != 04839)
    {
       Shift code
    }

48390 という数字が 5 つ入力されている可能性があります。while ループでその 4 つの ar[1] を回転させて、数値が 04839 になるまでシフトしたい

これが理にかなっていることを願っています。ほとんどのページがすべての要素を右にシフトすることに基づいてシフトに関する情報を投稿しており、特定の要素を 1 つだけシフトしたいため、この質問を投稿しています。

ご覧いただきありがとうございます。

編集:私はもっと具体的であるべきでした。配列の各要素が何であるかわからない場合はどうすればよいでしょうか? だからアンカーとして「0」に頼ることができませんでした。別の数値セットには、「00238」などの別の数値が含まれる場合があります。

4

9 に答える 9

1

あなたの例にあるのは、次のように実装できるスワップです。

private void Swap(ref int[] array, int index1, int index2)
{
    int temp = array[index1];
    array[index1] = array[index2];
    array[index2] = temp;
}

呼び出すSwap(ref source, 0, 1)と、1 番目と 2 番目の要素が交換されます。あなたが望むのは次のとおりです。

for (int i = 0; i < a.Length-1; i++)
{
    Swap(ref a, i, i+1);
}

これにより、最初の要素が各反復の最後の位置まで「バブル」されます。

于 2012-12-11T14:52:20.247 に答える
1

これはどう:

            List<int> l = new List<int>(){0,6,7,8,9};

            for (int i=1;i<5;i++)
            {
                l.Remove(0);
                l.Insert(i, 0);
            }
于 2012-12-11T14:53:06.893 に答える
0

多分

int oldLast = ar[ar.Length - 1];
for (int i = ar.Length - 1; i >= 0; i--)
    ar[i] = i == 0 ? oldLast : ar[i - 1];

デモ

于 2012-12-11T14:57:49.867 に答える
0
r=ar[0];

for (int i = 0; ar.lenght;i++)
{
ar[i]=ar[i + 1];
}

ar[ar.lenght] = r;
于 2012-12-11T14:52:33.167 に答える
0

これは単なるアイテムの順列です。以下は、順列アルゴリズムの完全なソース コードです。

    static List<string> Put(char s1, string list)
    {
        List<string> str =new List<string>();

        for (int i = 0; i < list.Length+1; i++)
        {
            string s = list.Substring(0, i) + s1.ToString() + list.Substring(i);
            str.Add(s);
        }
        return str;
    }
    static List<string> Permute(string list,int x)
    {
        List<string> Result = new List<string>();
        if (list.Length == 1)
        {
            Result.Add(list[0].ToString());
            return Result;
        }
        else
        {

            char first = list[0];
            list = list.Substring(x+1);
            List<string> part = Permute(list,0);
            foreach (string str in part)
            {
                  List<string> hasBeenPlaced = Put(first, str);
                  foreach (string str2 in hasBeenPlaced)
                  {
                        Result.Add(str2);
                  }
            }

        }

        return Result;
    }
    static void Main(string[] args)
    {

        List<string> per = Permute("abc",0);
        for (int i = 0; i < per.Count; i++)
        {
            Console.WriteLine(per[i]);
        }
        Console.ReadKey();
    }

foreach の後にブレークを追加すると、問題は解決されます。(すべてではなく、必要なアイテムのすべての順列を書き込みます....)それを次のように変更します。

       foreach (string str in part)
        {
            List<string> hasBeenPlaced = Put(first, str);
            foreach (string str2 in hasBeenPlaced)
            {
                Result.Add(str2);
            }
            break;
        }

お役に立てれば幸いです

于 2012-12-11T15:12:20.863 に答える
0

代わりにLinkedListを使用することを考えましたか? リンクされたリストのデータ構造は、配列よりもおそらくあなたがしようとしていることにより適しています。AddFirst、AddLast、AddAfter、および AddBefore メソッドを使用すると、配列を毎回再編成するよりもはるかに効率的な方法で要素をリストに挿入できます。

リンクされたリストの欠点は、要素を順番に読み取る必要があることです。したがって、要素の挿入/削除には非常に効率的ですが、要素にランダムにアクセスするには非効率的です。

LinkedList の概要については、ここを参照してください。

于 2012-12-11T14:50:23.130 に答える