Skip to content

Commit d1ec643

Browse files
committed
first positive integer implementation
1 parent fccd4e8 commit d1ec643

File tree

3 files changed

+90
-0
lines changed

3 files changed

+90
-0
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package problems.impl;
2+
3+
import problems.interfaces.FirstMissingPositiveIntegerIdentifier;
4+
5+
public class FirstMissingPositiveIntegerIdentifierImpl implements FirstMissingPositiveIntegerIdentifier {
6+
7+
/**
8+
* Given an array of integers, identify if any of these array values are between 1 and the
9+
* length of the array, inclusive.
10+
*
11+
* If an array value is between 1 and the length of the array, then it is considered "seen" and
12+
* it's boolean index (minus 1, since we start counting from 1) is set to true.
13+
*
14+
* @param values array of integers
15+
* @return array of booleans that represents if any of the input values is between 1 and the
16+
* length of the input array
17+
*/
18+
@Override
19+
public boolean[] identifyIfFirstIntegersHaveBeenSeen(final int[] values) {
20+
final boolean[] seenValues = new boolean[values.length];
21+
for (final int value : values) {
22+
if (value > 0 && value <= values.length && !seenValues[value - 1]) {
23+
seenValues[value - 1] = true;
24+
}
25+
}
26+
return seenValues;
27+
}
28+
29+
/**
30+
* Identify the first positive integer not in the input integer array.
31+
*
32+
* If the input integer array is -1, -2 then the first positive integer is 1.
33+
*
34+
* @param values input integer array
35+
* @return first positive integer not in input integer array
36+
*/
37+
@Override
38+
public int identifyFirstMissingPositiveInteger(final int[] values) {
39+
final boolean[] seenIntegers = identifyIfFirstIntegersHaveBeenSeen(values);
40+
for (int index = 0; index < seenIntegers.length; index++) {
41+
if (!seenIntegers[index]) {
42+
return index + 1;
43+
}
44+
}
45+
46+
return seenIntegers.length + 1;
47+
}
48+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package problems.interfaces;
2+
3+
public interface FirstMissingPositiveIntegerIdentifier {
4+
int identifyFirstMissingPositiveInteger(int[] values) ;
5+
6+
boolean[] identifyIfFirstIntegersHaveBeenSeen(int[] values);
7+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package problems.impl;
2+
3+
import org.junit.Assert;
4+
import org.junit.Test;
5+
import problems.exceptions.NoFirstMissingPositiveIntegerException;
6+
import problems.interfaces.FirstMissingPositiveIntegerIdentifier;
7+
8+
import java.util.Arrays;
9+
10+
public class FirstMissingPositiveIntegerIdentifierImplTest {
11+
private final FirstMissingPositiveIntegerIdentifier firstMissingPositiveIntegerIdentifier = new FirstMissingPositiveIntegerIdentifierImpl();
12+
13+
@Test
14+
public void itShouldReturnSeenValues() {
15+
Assert.assertTrue(Arrays.equals(firstMissingPositiveIntegerIdentifier.identifyIfFirstIntegersHaveBeenSeen(new int[]{}), new boolean[]{}));
16+
Assert.assertTrue(Arrays.equals(firstMissingPositiveIntegerIdentifier.identifyIfFirstIntegersHaveBeenSeen(new int[]{-1}), new boolean[]{false}));
17+
Assert.assertTrue(Arrays.equals(firstMissingPositiveIntegerIdentifier.identifyIfFirstIntegersHaveBeenSeen(new int[]{0}), new boolean[]{false}));
18+
Assert.assertTrue(Arrays.equals(firstMissingPositiveIntegerIdentifier.identifyIfFirstIntegersHaveBeenSeen(new int[]{1}), new boolean[]{true}));
19+
Assert.assertTrue(Arrays.equals(firstMissingPositiveIntegerIdentifier.identifyIfFirstIntegersHaveBeenSeen(new int[]{2}), new boolean[]{false}));
20+
Assert.assertTrue(Arrays.equals(firstMissingPositiveIntegerIdentifier.identifyIfFirstIntegersHaveBeenSeen(new int[]{2, 3}), new boolean[]{false, true}));
21+
Assert.assertTrue(Arrays.equals(firstMissingPositiveIntegerIdentifier.identifyIfFirstIntegersHaveBeenSeen(new int[]{1, 3, 3, 1}), new boolean[]{true, false, true, false}));
22+
}
23+
24+
@Test
25+
public void itShouldIdentifyFirstMissingPositiveInteger() {
26+
Assert.assertEquals(firstMissingPositiveIntegerIdentifier.identifyFirstMissingPositiveInteger(new int[]{}), 1);
27+
Assert.assertEquals(firstMissingPositiveIntegerIdentifier.identifyFirstMissingPositiveInteger(new int[]{-1}), 1);
28+
Assert.assertEquals(firstMissingPositiveIntegerIdentifier.identifyFirstMissingPositiveInteger(new int[]{0}), 1);
29+
Assert.assertEquals(firstMissingPositiveIntegerIdentifier.identifyFirstMissingPositiveInteger(new int[]{1}), 2);
30+
Assert.assertEquals(firstMissingPositiveIntegerIdentifier.identifyFirstMissingPositiveInteger(new int[]{2}), 1);
31+
Assert.assertEquals(firstMissingPositiveIntegerIdentifier.identifyFirstMissingPositiveInteger(new int[]{2, 3}), 1);
32+
Assert.assertEquals(firstMissingPositiveIntegerIdentifier.identifyFirstMissingPositiveInteger(new int[]{1, 3, 3, 1}), 2);
33+
}
34+
35+
}

0 commit comments

Comments
 (0)