如何在给定数组大小和开头的情况下获得特定的数组序列

时间:2012-05-02 10:38:15

标签: c# asp.net linq list loops

我有以下情况:

列表或数组。大小是我从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

3 个答案:

答案 0 :(得分: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);

请添加一些条件,如数组大小不应小于月份,用户总是输入整数,并在try catch中进行良好练习...等等

在使用其他答案中的一些逻辑后,我认为下面的代码要好得多。

                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);
                }

第二种方法只有O(n)的复杂度较低,因为它只使用一个循环而不是2。

第三种解决方案更简单:)

                for (int i = 0; i < size; i++)
                {
                    if (i < month)
                        source.Add(i + month);
                    else
                        source.Add((i - month) + 1);
                }
希望它有所帮助。

答案 1 :(得分:2)

这样的事情怎么样:

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

您可以将数字12更改为方法的第三个参数。

答案 2 :(得分: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;
}