0

私は次のケースを持っています:

リストまたは配列。サイズは、ユーザーから取得した 1 から 12 までの変数です。

サイズが 3 の場合、配列 {1,2,3}

サイズが 5 の場合、配列 {1,2,3,4,5}

等々

今、始まりも変数です。

私が取得したいシーケンスは次のとおりです。

たとえば、サイズが 12 で、先頭が 9 の場合

この特定の順序で次の結果が必要です。

9,10,11,12,1,2,3,4,5,6,7,8

つまり、指定された開始から最後の項目まで開始し、開始でない場合は開始まで1続行し1ます。

私はそれをしましたが、それはサイズに固有のものでした12:

このコードで:


        int[] arr = new int[12];
        int month = 9;//input from the user
        List<int> source = new List<int>();
        while (month <= 12)
        {
            source.Add(month);
            month++;
        }
        if (source.Count < 12)
        {
            for (int i = 1; i < source[0]; i++)
            {
                source.Add(i);
            }
        }

可変サイズだけでなく、より一般的なソリューションが必要です12

4

3 に答える 3

2

私はそれをテストしました、そしてそれは働きます

                int arrsize = Convert.ToInt32(Console.ReadLine());
                int[] arr = new int[arrsize];
                int month = Convert.ToInt32(Console.ReadLine());//input from the user
                List<int> source = new List<int>();
                while (month <= arrsize)
                {
                    source.Add(month);
                    month++;
                }
                if (source.Count < arrsize)
                {
                    for (int i = 1; i < source[0]; i++)
                    {
                        source.Add(i);
                    }
                }
                foreach (int i in source)
                    Console.Write(i);

配列サイズが月以上である必要があり、ユーザーは常に整数を入力し、グッドプラクティスのためにtrycatchでそれを行うなどの条件を追加してください...など

他の回答からいくつかのロジックを使用した後、私は以下のコードがはるかに優れていると思います。

                int arrsize = Convert.ToInt32(Console.ReadLine());
                int month = Convert.ToInt32(Console.ReadLine());//input from the user
                List<int> source = new List<int>();
                int temp = 0;
                for (int i = 0; i < arrsize; i++)
                {
                    temp = i + month;
                    if (temp != arrsize)
                        source.Add(((i + month) % arrsize));
                    else
                        source.Add(arrsize);
                }

2番目の方法は、2ではなく1つのループのみを使用するため、O(n)のみの複雑さが少なくなります。

3番目の解決策はさらに簡単です:)

                for (int i = 0; i < size; i++)
                {
                    if (i < month)
                        source.Add(i + month);
                    else
                        source.Add((i - month) + 1);
                }

それが役に立てば幸い。

于 2012-05-02T10:44:52.073 に答える
2

このようなものはどうですか:

        static IEnumerable<int> GetSequence(int size, int beginning)
        {
          return Enumerable.Range(beginning, size).Select(i => 1 + (i - 1) % 12);
        }

数値12をメソッドの 3 番目のパラメーターに変更できます。

于 2012-05-02T10:51:38.243 に答える
1
static int[] Sequence(int size, int start)
{
    start--;
    int[] result = new int[size];

    for (int i = 0; i < size; i++)
    {
        result[i] = ((i + start) % size ) + 1;
    }

    return result;
}
于 2012-05-02T10:51:48.847 に答える