Last active
January 20, 2016 17:08
-
-
Save jtribble/a4521ba74fa869858c45 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // See: http://careercup.com/question?id=5755014750404608 | |
| // | |
| // Input: [[1,3], [5,7], [2,4], [6,8]] | |
| // Output: [[1,4], [5,8]] (no specific order) | |
| // | |
| var mergeRanges = (function () { | |
| /** | |
| * Do these two ranges overlap? | |
| * | |
| * @param {array} a | |
| * @param {array} b | |
| * @return {boolen} | |
| */ | |
| var overlaps = function (a, b) { | |
| return a[0] >= b[0] && a[0] <= b[1] // a[lo] is in range of b | |
| || a[1] >= b[0] && a[1] <= b[1]; // a[hi] is in range of b | |
| }; | |
| /** | |
| * Merge two ranges, assuming overlap | |
| * | |
| * @param {array} a | |
| * @param {array} b | |
| * @return {array} | |
| */ | |
| var merge = function (a, b) { | |
| return [Math.min(a[0], b[0]), Math.max(a[1], b[1])]; | |
| }; | |
| /** | |
| * Merge a single range into a list of ranges | |
| * | |
| * @param {array[array]} list | |
| * @param {array} range | |
| * @param {array[array]} | |
| */ | |
| var mergeRange = function (list, range) { | |
| for (var i = 0; i < list.length; i++) { | |
| if (overlaps(list[i], range)) { // the range overlaps | |
| var newRange = merge(list[i], range); | |
| list.splice(i, 1); | |
| return mergeRange(list, newRange); // recursive call | |
| } | |
| } | |
| list.push(range); // the range doesn't overlap, so just add it to list | |
| return list; | |
| }; | |
| /** | |
| * Merge a list of ranges into each other | |
| * | |
| * @param {array[array]} ranges | |
| * @return {array[array]} | |
| */ | |
| return function (ranges) { | |
| return ranges.reduce(function (acc, curr) { | |
| return mergeRange(acc, curr); | |
| }, []); | |
| } | |
| })(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment