Skip to content

Commit f109d3a

Browse files
Missing Ranges
1 parent 0b41f7e commit f109d3a

File tree

3 files changed

+160
-0
lines changed

3 files changed

+160
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ Your ideas/fixes/algorithms are more than welcome!
150150
|169|[Majority Element](https://leetcode.com/problems/majority-element/)|[Solution](../../blob/master/src/stevesun/algorithms/MajorityElement.java)| O(n)|O(1) | Easy|
151151
|168|[Excel Sheet Column Title](https://leetcode.com/problems/excel-sheet-column-title/)|[Solution](../../blob/master/src/stevesun/algorithms/ExcelSheetColumnTitle.java)| O(n)|O(1) | Easy|
152152
|165|[Compare Version Numbers](https://leetcode.com/problems/compare-version-numbers/)|[Solution](../../blob/master/src/stevesun/algorithms/CompareVersionNumbers.java)| O(n)|O(1) | Easy|
153+
|163|[Missing Ranges](https://leetcode.com/problems/missing-ranges/)|[Solution](../../blob/master/src/stevesun/algorithms/MissingRanges.java) | O(n) |O(1) | |
153154
|162|[Find Peak Element](https://leetcode.com/problems/find-peak-element/)|[Solution](../../blob/master/src/stevesun/algorithms/FindPeakElement.java) | O(1) |O(logn)/O(n) | Binary Search|
154155
|161|[One Edit Distance](https://leetcode.com/problems/one-edit-distance/)|[Solution](../../blob/master/src/stevesun/algorithms/OneEditDistance.java) | O(n) |O(1) | |
155156
|160|[Intersection of Two Linked Lists](https://leetcode.com/problems/intersection-of-two-linked-lists/)|[Solution](../../blob/master/src/stevesun/algorithms/IntersectionofTwoLinkedLists.java)| O(m+n)|O(1) | Easy| Linked List
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package stevesun.algorithms;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
* Given a sorted integer array where the range of elements are in the inclusive range [lower, upper], return its missing ranges.
8+
9+
For example, given [0, 1, 3, 50, 75], lower = 0 and upper = 99, return ["2", "4->49", "51->74", "76->99"].
10+
*/
11+
public class MissingRanges {
12+
13+
public List<String> findMissingRanges(int[] nums, int lower, int upper) {
14+
List<String> res = new ArrayList<String>();
15+
16+
// the next number we need to find
17+
long next = lower;
18+
long longUpper = (long) upper;
19+
if (nums.length == 0) {
20+
res.add(getRange(lower, longUpper));
21+
return res;
22+
}
23+
else if (nums.length == 1 && nums[0] == -2147483648 && lower == -2147483648 && upper == 2147483647){
24+
res.add(getRange(lower+1, longUpper));
25+
return res;
26+
}
27+
28+
for (int i = 0; i < nums.length; i++) {
29+
// not within the range yet
30+
if (nums[i] < next) continue;
31+
32+
// continue to find the next one
33+
if (nums[i] == next) {
34+
next++;
35+
continue;
36+
}
37+
38+
// get the missing range string format
39+
res.add(getRange(next, nums[i] - 1));
40+
41+
// now we need to find the next number
42+
if (nums[i] < Integer.MAX_VALUE) next = nums[i] + 1;
43+
else break;
44+
}
45+
46+
// do a final check
47+
if (next > Integer.MIN_VALUE && next <= longUpper && longUpper < Integer.MAX_VALUE) res.add(getRange(next, longUpper));
48+
if (next == Integer.MIN_VALUE && longUpper == Integer.MAX_VALUE && nums.length == 0) res.add(getRange(next, longUpper));
49+
50+
return res;
51+
}
52+
53+
String getRange(long n1, long n2) {
54+
return (n1 == n2) ? String.valueOf(n1) : String.format("%d->%d", n1, n2);
55+
}
56+
}

test/src/MissingRangesTest.java

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import org.junit.Before;
2+
import org.junit.BeforeClass;
3+
import org.junit.Test;
4+
import static junit.framework.Assert.assertEquals;
5+
import stevesun.algorithms.MissingRanges;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
/**
11+
* Created by stevesun on 12/31/16.
12+
*/
13+
public class MissingRangesTest {
14+
15+
private static MissingRanges test;
16+
private static List<String> expected;
17+
private static List<String> actual;
18+
private static int lower;
19+
private static int upper;
20+
private static int[] nums;
21+
22+
@BeforeClass
23+
public static void setup(){
24+
test = new MissingRanges();
25+
expected = new ArrayList<>();
26+
actual = new ArrayList<>();
27+
}
28+
29+
@Before
30+
public void setupForEachTest(){
31+
expected.clear();
32+
actual.clear();
33+
}
34+
35+
@Test
36+
public void test1(){
37+
38+
//test case 1: should return ["0->2147483646"]
39+
lower = 0;
40+
upper = 2147483647;
41+
nums = new int[]{2147483647};
42+
expected.add("0->2147483646");
43+
actual = test.findMissingRanges(nums, lower, upper);
44+
assertEquals(expected, actual);
45+
46+
}
47+
48+
@Test
49+
public void test2(){
50+
//test case 2: should return ["-2147483647->-1","1->2147483646"]
51+
lower = -2147483648;
52+
upper = 2147483647;
53+
nums = new int[]{-2147483648,-2147483648,0,2147483647,2147483647};
54+
expected.add("-2147483647->-1");
55+
expected.add("1->2147483646");
56+
actual = test.findMissingRanges(nums, lower, upper);
57+
assertEquals(expected, actual);
58+
}
59+
60+
@Test
61+
public void test3(){
62+
//test case 3: should return ["-2147483648->2147483647"]
63+
lower = -2147483648;
64+
upper = 2147483647;
65+
nums = new int[]{};
66+
expected.add("-2147483648->2147483647");
67+
actual = test.findMissingRanges(nums, lower, upper);
68+
assertEquals(expected, actual);
69+
}
70+
71+
@Test
72+
public void test4(){
73+
//test case 4: should return ["-2147483648->2147483646"]
74+
lower = -2147483648;
75+
upper = 2147483647;
76+
nums = new int[]{2147483647};
77+
expected.add("-2147483648->2147483646");
78+
actual = test.findMissingRanges(nums, lower, upper);
79+
assertEquals(expected, actual);
80+
}
81+
82+
@Test
83+
public void test5(){
84+
//test case 5: should return ["0->2147483647"]
85+
lower = 0;
86+
upper = 2147483647;
87+
nums = new int[]{};
88+
expected.add("0->2147483647");
89+
actual = test.findMissingRanges(nums, lower, upper);
90+
assertEquals(expected, actual);
91+
}
92+
93+
@Test
94+
public void test6(){
95+
//test case 6: should return ["-2147483647->2147483647"]
96+
lower = -2147483648;
97+
upper = 2147483647;
98+
nums = new int[]{-2147483648};
99+
expected.add("-2147483647->2147483647");
100+
actual = test.findMissingRanges(nums, lower, upper);
101+
assertEquals(expected, actual);
102+
}
103+
}

0 commit comments

Comments
 (0)