2
2
3
3
import java .util .ArrayList ;
4
4
import java .util .Arrays ;
5
- import java . util . HashMap ;
5
+ import org . apache . commons . lang3 . tuple . MutablePair ;
6
6
7
7
/**
8
8
* @brief class computing the n-th ugly number (when they are sorted)
16
16
*/
17
17
public class NthUglyNumber {
18
18
private ArrayList <Long > uglyNumbers = new ArrayList <>(Arrays .asList (1L ));
19
- private final int [] baseNumbers ;
20
- private HashMap <Integer , Integer > positions = new HashMap <>();
19
+ private ArrayList <MutablePair <Integer , Integer >> positions = new ArrayList <>();
21
20
22
21
/**
23
22
* @brief initialized the object allowing to compute ugly numbers with given base
@@ -29,9 +28,8 @@ public class NthUglyNumber {
29
28
throw new IllegalArgumentException ("baseNumbers must be non-empty." );
30
29
}
31
30
32
- this .baseNumbers = baseNumbers ;
33
31
for (final var baseNumber : baseNumbers ) {
34
- this .positions .put ( baseNumber , 0 );
32
+ this .positions .add ( MutablePair . of ( baseNumber , 0 ) );
35
33
}
36
34
}
37
35
@@ -59,21 +57,21 @@ private void addUglyNumber() {
59
57
60
58
private void updatePositions () {
61
59
final var lastUglyNumber = uglyNumbers .get (uglyNumbers .size () - 1 );
62
- for (final var baseNumber : baseNumbers ) {
63
- if (computeCandidate (baseNumber ) == lastUglyNumber ) {
64
- positions . put ( baseNumber , positions . get ( baseNumber ) + 1 );
60
+ for (var entry : positions ) {
61
+ if (computeCandidate (entry ) == lastUglyNumber ) {
62
+ entry . setValue ( entry . getValue ( ) + 1 );
65
63
}
66
64
}
67
65
}
68
66
69
- private long computeCandidate (final int candidateBase ) {
70
- return candidateBase * uglyNumbers .get (positions . get ( candidateBase ));
67
+ private long computeCandidate (final MutablePair < Integer , Integer > entry ) {
68
+ return entry . getKey () * uglyNumbers .get (entry . getValue ( ));
71
69
}
72
70
73
71
private long computeMinimalCandidate () {
74
72
long res = Long .MAX_VALUE ;
75
- for (final var baseNumber : baseNumbers ) {
76
- res = Math .min (res , computeCandidate (baseNumber ));
73
+ for (final var entry : positions ) {
74
+ res = Math .min (res , computeCandidate (entry ));
77
75
}
78
76
return res ;
79
77
}
0 commit comments