From 2dc927ea9b077210b1e561d9ff6562a12922379c Mon Sep 17 00:00:00 2001 From: vunamtien Date: Thu, 7 Mar 2024 00:47:29 +0700 Subject: [PATCH] BAEL-7555-count-unique-digit-in-integer (#15933) * BAEL-7555-count-unique-digit-in-integer * rename test case * add solution using stream --- .../uniquedigit/UniqueDigitCounter.java | 36 ++++++++++++++++++ .../UniqueDigitCounterUnitTest.java | 38 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 algorithms-modules/algorithms-miscellaneous-7/src/main/java/com/baeldung/algorithms/uniquedigit/UniqueDigitCounter.java create mode 100644 algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/uniquedigit/UniqueDigitCounterUnitTest.java diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/main/java/com/baeldung/algorithms/uniquedigit/UniqueDigitCounter.java b/algorithms-modules/algorithms-miscellaneous-7/src/main/java/com/baeldung/algorithms/uniquedigit/UniqueDigitCounter.java new file mode 100644 index 0000000000..474d31b268 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-7/src/main/java/com/baeldung/algorithms/uniquedigit/UniqueDigitCounter.java @@ -0,0 +1,36 @@ +package com.baeldung.algorithms.uniquedigit; + +import java.util.HashSet; +import java.util.Set; + +public class UniqueDigitCounter { + + public static int countWithSet(int number) { + number = Math.abs(number); + Set uniqueDigits = new HashSet<>(); + String numberStr = String.valueOf(number); + for (char digit : numberStr.toCharArray()) { + uniqueDigits.add(digit); + } + return uniqueDigits.size(); + } + + public static int countWithBitManipulation(int number) { + if (number == 0) { + return 1; + } + number = Math.abs(number); + int mask = 0; + while (number > 0) { + int digit = number % 10; + mask |= 1 << digit; + number /= 10; + } + return Integer.bitCount(mask); + } + + public static long countWithStreamApi(int number) { + return String.valueOf(Math.abs(number)).chars().distinct().count(); + } + +} diff --git a/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/uniquedigit/UniqueDigitCounterUnitTest.java b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/uniquedigit/UniqueDigitCounterUnitTest.java new file mode 100644 index 0000000000..5acdc9df72 --- /dev/null +++ b/algorithms-modules/algorithms-miscellaneous-7/src/test/java/com/baeldung/algorithms/uniquedigit/UniqueDigitCounterUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.algorithms.uniquedigit; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class UniqueDigitCounterUnitTest { + + @Test + public void givenNotNegativeNumber_whenCountUniqueDigits_thenCorrectCount() { + assertEquals(3, UniqueDigitCounter.countWithSet(122333)); + assertEquals(1, UniqueDigitCounter.countWithSet(0)); + assertEquals(2, UniqueDigitCounter.countWithSet(101)); + + assertEquals(3, UniqueDigitCounter.countWithBitManipulation(122333)); + assertEquals(1, UniqueDigitCounter.countWithBitManipulation(0)); + assertEquals(2, UniqueDigitCounter.countWithBitManipulation(101)); + + assertEquals(3, UniqueDigitCounter.countWithStreamApi(122333)); + assertEquals(1, UniqueDigitCounter.countWithStreamApi(0)); + assertEquals(2, UniqueDigitCounter.countWithStreamApi(101)); + } + + @Test + public void givenNegativeNumber_whenCountUniqueDigits_thenCorrectCount() { + assertEquals(3, UniqueDigitCounter.countWithSet(-122333)); + assertEquals(3, UniqueDigitCounter.countWithBitManipulation(-122333)); + assertEquals(3, UniqueDigitCounter.countWithStreamApi(-122333)); + } + + @Test + public void givenLargeNumber_whenCountUniqueDigits_thenCorrectCount() { + assertEquals(2, UniqueDigitCounter.countWithSet(1000000000)); + assertEquals(2, UniqueDigitCounter.countWithBitManipulation(1000000000)); + assertEquals(2, UniqueDigitCounter.countWithStreamApi(1000000000)); + } + +}