我有以下情况:
列表或数组。大小是我从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
答案 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;
}