我有一个数字数组,代表使用过的位置。我希望将前1个未使用的数字从1号到任意数字。
例如,我的数组包含以下数字:1,2,5,6,8,9
基于该数组,我希望有一个包含以下数字的新数组:3,4,7,10,11,12,13,14 .... 500,501,502,503,504,505,506,507
是否有更有效的方法比拥有一个数字越来越多的循环,检查默认数组是否包含该数字,如果没有将它放在新数组中,检查新数组是否有500个值然后中断从循环?
谢谢!
答案 0 :(得分:2)
我建议实施 generator :
// source should be sorted
private static IEnumerable<int> Free(IEnumerable<int> source) {
int last = 0;
bool first = true;
foreach (var item in source) {
if (first)
first = false;
else
for (int i = last + 1; i < item; ++i) // <- Hole
yield return i;
last = item;
}
// The array exhausted
for (int i = last + 1; ; ++i)
yield return i;
}
然后在 Linq
的帮助下生成任意数量的项目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
答案 1 :(得分:2)
您可以使用linq:
IEnumerable<int> result = list.Except(usedList).Take(500);
答案 2 :(得分:1)
public int[] GetMissingNumbers(int[] provided, int maxLength)
{
var numbersBeyondEndOfProvidedRange = Enumerable.Range(1, provided.Length + maxLength);
return numbersBeyondEndOfProvidedRange.Except(provided).Take(maxLength).ToArray();
}
鉴于您的输入和500个数字的输出,最后一个数字是506,而不是507.
答案 3 :(得分:0)
您可以使用IEnumerable集合的GetRange方法
请访问以下链接:https://msdn.microsoft.com/en-us/library/21k0e39c(v=vs.110).aspx