C# 获得下一个500“;“免费”;数字
我有一个带有数字的数组,表示使用过的位置。我想从数字1到任意数字,得到前500个未使用的数字 例如,我的数组包含以下数字:1,2,5,6,8,9 基于该数组,我希望有一个包含以下数字的新数组:3,4,7,10,11,12,13,14…500501502507 有没有比使用一个递增的循环更有效的方法,检查该数字是否包含在默认数组中,如果不将其放入新数组中,检查新数组是否有500个值,然后从循环中断 谢谢 我建议实施生成器: 您可以使用linq:C# 获得下一个500“;“免费”;数字,c#,asp.net,arrays,integer,C#,Asp.net,Arrays,Integer,我有一个带有数字的数组,表示使用过的位置。我想从数字1到任意数字,得到前500个未使用的数字 例如,我的数组包含以下数字:1,2,5,6,8,9 基于该数组,我希望有一个包含以下数字的新数组:3,4,7,10,11,12,13,14…500501502507 有没有比使用一个递增的循环更有效的方法,检查该数字是否包含在默认数组中,如果不将其放入新数组中,检查新数组是否有500个值,然后从循环中断 谢谢 我建议实施生成器: 您可以使用linq: IEnumerable<int> res
IEnumerable<int> result = list.Except(usedList).Take(500);
IEnumerable result=list.Except(usedList).Take(500);
您可以使用IEnumerable集合的GetRange方法
请浏览以下连结:
给定您的输入和500个数字的输出,最后一个数字是506,而不是507 拥有一个包含
Id
属性和IsUsed
属性的Location
对象不是更容易吗?这样,您就可以通过LINQ过滤掉任何使用过的~is
提示:假设您正在编写C标准库——有人不得不这样做!您将如何有效地实施malloc
?因为您的问题与malloc非常相似:您有一堆已经使用的内存,有人要求您再提供500个连续字节,您必须提供它们。您可以比使用一个数组更有效地执行此操作,该数组中的每个字节都有一个数字。第二个提示:Malloc不使用数组。由于选择了错误的数据结构,您的算法无法提高效率。选择一个数据结构而不是一个数组来表示您的忙/闲列表。@EricLippert:可能OP没有选择该数据结构,但这是一项要求。在这种情况下,您可以从中生成自己的最佳数据结构,然后再开始确定所需的500个数字。
int[] used = new[] { 1,2,5,6,8,9};
int[] free = Free(used)
.Take(501) // <- if you want 507 being the last item you have to take 501 items
.ToArray();
Console.Write(string.Join(", ", free));
3, 4, 7, 10, 11, 12, 13, 14, ..., 505, 506, 507
IEnumerable<int> result = list.Except(usedList).Take(500);
public int[] GetMissingNumbers(int[] provided, int maxLength)
{
var numbersBeyondEndOfProvidedRange = Enumerable.Range(1, provided.Length + maxLength);
return numbersBeyondEndOfProvidedRange.Except(provided).Take(maxLength).ToArray();
}