Skip to content

Instantly share code, notes, and snippets.

@davidvthecoder
Created September 9, 2013 19:28

Revisions

  1. David Vaini created this gist Sep 9, 2013.
    41 changes: 41 additions & 0 deletions FindRanges.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,41 @@
    public List<Range> findRanges(List<int> numbers) {
    List<Range> ranges = new List<Range>(); // create a list of ranges that will eventually be populated.
    numbers = numbers.OrderBy(x=>x).ToList<int>(); // order the list of numbers coming in.
    int min = numbers.Min(); // get the smallest number
    int max = numbers.Max(); // get the largest number
    List<int> missingNumbers = new List<int>(); // create an empty list of missing numbers
    int i = min; // create a counter for stepping through all the numbers starting with the smallest number
    while (i < max) { // step through each possible number from min to max.
    if (!numbers.Contains(i)) { // if the number doesnt exist from our list, its a missing number
    // found a gap in the number (missing number)
    missingNumbers.Add(i); // add the number to the list of missing numbers.
    }
    i++; // increase the counter by 1.
    }
    int tempLow = min; // create a tempLow starting with the min since its our first low value.
    int countInc = 1; // create a count incrementer. This is for checking for the last possible range. last found number to max.
    foreach (int num in missingNumbers) { // step through the list of missing numbers
    if (tempLow != num) { // if tempLow is not the same as the missing number create a new range
    Range r = new Range { // new rang is always the tempLow to the missing number - 1
    low = tempLow, // temp low which is the first valid number after the last high value
    high = num - 1 // last high value is the last valid number before the current missing number
    };
    // example 1,2,5,6 - 3,4 are both missing numbers. one less than missing number is a high number and the low number was the last valid high number
    tempLow = num + 1; // add 1 to the last misisng number in attempt to find the next lowest number- note will not be used if its a missing number with the if statement above.
    ranges.Add(r); // add the range to the list of ranges.
    } else { // if tempLow is accidentally set to a missing number, increase it by 1 until is not a missing number
    tempLow += 1; // tempLow should be increase until it is a valid number ( not a missing number)
    }
    if (missingNumbers.Count == countInc) { // if this is the last item in the foreach of missing numbers ( then create the last range
    Range lastRange = new Range{
    low = tempLow, // last valid number
    high = max // the last and highest value
    };
    if(!ranges.Contains(lastRange)){ // if the last valid number has not been added to the ranges, do so.
    ranges.Add(lastRange);
    }
    }
    countInc += 1; // increase the foreach counter by 1.
    }
    return ranges; // return the list of ranges.
    }
    4 changes: 4 additions & 0 deletions RangeClass.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,4 @@
    public class Range {
    public int low { get; set; } // low value for the range
    public int high { get; set; } // high value for the range
    }