fix: handle Null Dereference in NthUglyNumber (#5469)

This commit is contained in:
Piotr Idzik
2024-09-24 20:00:38 +02:00
committed by GitHub
parent 1460eb7bbe
commit 27343e7aa8
2 changed files with 10 additions and 13 deletions

View File

@ -9,7 +9,6 @@
"src/main/java/com/thealgorithms/datastructures/trees/CreateBinaryTreeFromInorderPreorder.java", "src/main/java/com/thealgorithms/datastructures/trees/CreateBinaryTreeFromInorderPreorder.java",
"src/main/java/com/thealgorithms/divideandconquer/ClosestPair.java", "src/main/java/com/thealgorithms/divideandconquer/ClosestPair.java",
"src/main/java/com/thealgorithms/dynamicprogramming/Fibonacci.java", "src/main/java/com/thealgorithms/dynamicprogramming/Fibonacci.java",
"src/main/java/com/thealgorithms/maths/NthUglyNumber.java",
"src/main/java/com/thealgorithms/maths/SimpsonIntegration.java", "src/main/java/com/thealgorithms/maths/SimpsonIntegration.java",
"src/main/java/com/thealgorithms/others/Dijkstra.java", "src/main/java/com/thealgorithms/others/Dijkstra.java",
"src/main/java/com/thealgorithms/sorts/TopologicalSort.java", "src/main/java/com/thealgorithms/sorts/TopologicalSort.java",

View File

@ -2,7 +2,7 @@ package com.thealgorithms.maths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import org.apache.commons.lang3.tuple.MutablePair;
/** /**
* @brief class computing the n-th ugly number (when they are sorted) * @brief class computing the n-th ugly number (when they are sorted)
@ -16,8 +16,7 @@ import java.util.HashMap;
*/ */
public class NthUglyNumber { public class NthUglyNumber {
private ArrayList<Long> uglyNumbers = new ArrayList<>(Arrays.asList(1L)); private ArrayList<Long> uglyNumbers = new ArrayList<>(Arrays.asList(1L));
private final int[] baseNumbers; private ArrayList<MutablePair<Integer, Integer>> positions = new ArrayList<>();
private HashMap<Integer, Integer> positions = new HashMap<>();
/** /**
* @brief initialized the object allowing to compute ugly numbers with given base * @brief initialized the object allowing to compute ugly numbers with given base
@ -29,9 +28,8 @@ public class NthUglyNumber {
throw new IllegalArgumentException("baseNumbers must be non-empty."); throw new IllegalArgumentException("baseNumbers must be non-empty.");
} }
this.baseNumbers = baseNumbers;
for (final var baseNumber : baseNumbers) { for (final var baseNumber : baseNumbers) {
this.positions.put(baseNumber, 0); this.positions.add(MutablePair.of(baseNumber, 0));
} }
} }
@ -59,21 +57,21 @@ public class NthUglyNumber {
private void updatePositions() { private void updatePositions() {
final var lastUglyNumber = uglyNumbers.get(uglyNumbers.size() - 1); final var lastUglyNumber = uglyNumbers.get(uglyNumbers.size() - 1);
for (final var baseNumber : baseNumbers) { for (var entry : positions) {
if (computeCandidate(baseNumber) == lastUglyNumber) { if (computeCandidate(entry) == lastUglyNumber) {
positions.put(baseNumber, positions.get(baseNumber) + 1); entry.setValue(entry.getValue() + 1);
} }
} }
} }
private long computeCandidate(final int candidateBase) { private long computeCandidate(final MutablePair<Integer, Integer> entry) {
return candidateBase * uglyNumbers.get(positions.get(candidateBase)); return entry.getKey() * uglyNumbers.get(entry.getValue());
} }
private long computeMinimalCandidate() { private long computeMinimalCandidate() {
long res = Long.MAX_VALUE; long res = Long.MAX_VALUE;
for (final var baseNumber : baseNumbers) { for (final var entry : positions) {
res = Math.min(res, computeCandidate(baseNumber)); res = Math.min(res, computeCandidate(entry));
} }
return res; return res;
} }