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

请添加一些条件,例如数组大小不应小于月份,并且用户始终输入整数并在 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);
                }

希望能帮助到你。

于 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为方法的第三个参数。

于 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 回答