using System.Collections.Generic;
public static void Main(string[] args)
var locator = new Locator();
int? resultFindMissing = locator.FindMissing(new List<int> {1, 2, 3, 5});
if(resultFindMissing != 4){
Console.Out.WriteLine("got invalid result for case 1 (expect 4): " + resultFindMissing);
resultFindMissing = locator.FindMissing(new List<int> {1, 2, 3, 4, 5});
if(resultFindMissing != null){
Console.Out.WriteLine("got invalid result for case 2 (expect null): " + resultFindMissing);
bool resultIsMissing = locator.IsMissing(new List<int> {1, 2, 3, 5});
Console.Out.WriteLine("got invalid result for case 3 (expect true): " + resultIsMissing);
resultIsMissing = locator.IsMissing(new List<int> {1, 2, 3, 4, 5});
Console.Out.WriteLine("got invalid result for case 4 (expect false): " + resultIsMissing);
resultFindMissing = locator.FindMissing(new List<int> {3, 4, 6});
if(resultFindMissing != 5){
Console.Out.WriteLine("got invalid result for case 5 (expect 5): " + resultFindMissing);
resultFindMissing = locator.FindMissing(new List<int> {3, 4, 5, 6});
if(resultFindMissing != null){
Console.Out.WriteLine("got invalid result for case 6 (expect null): " + resultFindMissing);
resultFindMissing = locator.FindMissing(new List<int> { 1, 1, 1, 2, 2, 3, 5, 5, 5, 5, 5 });
if(resultFindMissing != 4){
Console.Out.WriteLine("got invalid result for case 7 (expect 4): " + resultFindMissing);
resultFindMissing = locator.FindMissing(new List<int> { 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5 });
if(resultFindMissing != null){
Console.Out.WriteLine("got invalid result for case 8 (expect null): " + resultFindMissing);
locator.FindMissing(new List<int> {1, 3, 5});
catch(ArgumentOutOfRangeException){
Console.Out.WriteLine("got invalid result for case 9 (expect throw exception)");
locator.FindMissing(new List<int> {1, 5});
catch(ArgumentOutOfRangeException){
Console.Out.WriteLine("got invalid result for case 10 (expect throw exception)");
locator.FindMissing(new List<int> { int.MinValue, int.MaxValue });
catch(ArgumentOutOfRangeException){
Console.Out.WriteLine("got invalid result for case 11 (expect throw exception)");
Console.Out.WriteLine("green!");
public int? FindMissing(IEnumerable<int> values)
throw new ArgumentNullException("values");
int? missingValue = null;
foreach (var value in values.OrderBy(x => x))
if (previous.HasValue && value != previous + 1)
if (missingValue.HasValue || value - (long) previous > 2)
throw new ArgumentOutOfRangeException();
missingValue = previous + 1;
public bool IsMissing(IEnumerable<int> values)
return null != FindMissing(values);