22
33import java .util .ArrayList ;
44import java .util .Arrays ;
5- import java . util . HashMap ;
5+ import org . apache . commons . lang3 . tuple . MutablePair ;
66
77/**
88 * @brief class computing the n-th ugly number (when they are sorted)
1616 */
1717public class NthUglyNumber {
1818 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 <>();
2120
2221 /**
2322 * @brief initialized the object allowing to compute ugly numbers with given base
@@ -29,9 +28,8 @@ public class NthUglyNumber {
2928 throw new IllegalArgumentException ("baseNumbers must be non-empty." );
3029 }
3130
32- this .baseNumbers = baseNumbers ;
3331 for (final var baseNumber : baseNumbers ) {
34- this .positions .put ( baseNumber , 0 );
32+ this .positions .add ( MutablePair . of ( baseNumber , 0 ) );
3533 }
3634 }
3735
@@ -59,21 +57,21 @@ private void addUglyNumber() {
5957
6058 private void updatePositions () {
6159 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 );
6563 }
6664 }
6765 }
6866
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 ( ));
7169 }
7270
7371 private long computeMinimalCandidate () {
7472 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 ));
7775 }
7876 return res ;
7977 }
0 commit comments