Skip to content

Commit d1c1e6b

Browse files
authored
Add uniform number counting algorithm (#6052)
1 parent 5e9d1dc commit d1c1e6b

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

DIRECTORY.md

+4
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@
466466
* [SumWithoutArithmeticOperators](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/SumWithoutArithmeticOperators.java)
467467
* [TrinomialTriangle](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/TrinomialTriangle.java)
468468
* [TwinPrime](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/TwinPrime.java)
469+
* [UniformNumbers](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/UniformNumbers.java)
469470
* [VampireNumber](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/VampireNumber.java)
470471
* [VectorCrossProduct](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/VectorCrossProduct.java)
471472
* [Volume](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/maths/Volume.java)
@@ -597,6 +598,7 @@
597598
* [UnionFind](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/UnionFind.java)
598599
* [UpperBound](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/searches/UpperBound.java)
599600
* slidingwindow
601+
* [LongestSubarrayWithSumLessOrEqualToK](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/slidingwindow/LongestSubarrayWithSumLessOrEqualToK.java)
600602
* [LongestSubstringWithoutRepeatingCharacters](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharacters.java)
601603
* [MaxSumKSizeSubarray](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarray.java)
602604
* [MinSumKSizeSubarray](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/slidingwindow/MinSumKSizeSubarray.java)
@@ -1119,6 +1121,7 @@
11191121
* [SumWithoutArithmeticOperatorsTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/SumWithoutArithmeticOperatorsTest.java)
11201122
* [TestArmstrong](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/TestArmstrong.java)
11211123
* [TwinPrimeTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/TwinPrimeTest.java)
1124+
* [UniformNumbersTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/UniformNumbersTest.java)
11221125
* [VolumeTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/maths/VolumeTest.java)
11231126
* misc
11241127
* [ColorContrastRatioTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/misc/ColorContrastRatioTest.java)
@@ -1228,6 +1231,7 @@
12281231
* [UnionFindTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/UnionFindTest.java)
12291232
* [UpperBoundTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/searches/UpperBoundTest.java)
12301233
* slidingwindow
1234+
* [LongestSubarrayWithSumLessOrEqualToKTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/slidingwindow/LongestSubarrayWithSumLessOrEqualToKTest.java)
12311235
* [LongestSubstringWithoutRepeatingCharactersTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/slidingwindow/LongestSubstringWithoutRepeatingCharactersTest.java)
12321236
* [MaxSumKSizeSubarrayTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/slidingwindow/MaxSumKSizeSubarrayTest.java)
12331237
* [MinSumKSizeSubarrayTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/slidingwindow/MinSumKSizeSubarrayTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.thealgorithms.maths;
2+
3+
/**
4+
* A positive integer is considered uniform if all
5+
* of its digits are equal. For example, 222 is uniform,
6+
* while 223 is not.
7+
* Given two positive integers a and b, determine the
8+
* number of uniform integers between a and b.
9+
*/
10+
public final class UniformNumbers {
11+
// Private constructor to prevent instantiation of the utility class
12+
private UniformNumbers() {
13+
// Prevent instantiation
14+
}
15+
/**
16+
* This function will find the number of uniform numbers
17+
* from 1 to num
18+
* @param num upper limit to find the uniform numbers
19+
* @return the count of uniform numbers between 1 and num
20+
*/
21+
public static int uniformNumbers(int num) {
22+
String numStr = Integer.toString(num);
23+
int uniformCount = (numStr.length() - 1) * 9;
24+
int finalUniform = Integer.parseInt(String.valueOf(numStr.charAt(0)).repeat(numStr.length()));
25+
26+
if (finalUniform <= num) {
27+
uniformCount += Integer.parseInt(String.valueOf(numStr.charAt(0)));
28+
} else {
29+
uniformCount += Integer.parseInt(String.valueOf(numStr.charAt(0))) - 1;
30+
}
31+
32+
return uniformCount;
33+
}
34+
/**
35+
* This function will calculate the number of uniform numbers
36+
* between a and b
37+
* @param a lower bound of range
38+
* @param b upper bound of range
39+
* @return the count of uniform numbers between a and b
40+
*/
41+
public static int countUniformIntegers(int a, int b) {
42+
if (b > a && b > 0 && a > 0) {
43+
return uniformNumbers(b) - uniformNumbers(a - 1);
44+
} else if (b == a) {
45+
return 1;
46+
} else {
47+
return 0;
48+
}
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.thealgorithms.maths;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
class UniformNumbersTest {
8+
9+
@Test
10+
void testSingleUniformDigitRange() {
11+
assertEquals(1, UniformNumbers.countUniformIntegers(1, 1));
12+
assertEquals(9, UniformNumbers.countUniformIntegers(1, 9));
13+
}
14+
15+
@Test
16+
void testSmallRange() {
17+
assertEquals(1, UniformNumbers.countUniformIntegers(10, 11));
18+
assertEquals(2, UniformNumbers.countUniformIntegers(22, 33));
19+
}
20+
21+
@Test
22+
void testRangeWithNoUniformNumbers() {
23+
assertEquals(0, UniformNumbers.countUniformIntegers(12, 21));
24+
assertEquals(0, UniformNumbers.countUniformIntegers(123, 128));
25+
}
26+
27+
@Test
28+
void testRangeWithAllUniformNumbers() {
29+
assertEquals(9, UniformNumbers.countUniformIntegers(1, 9));
30+
assertEquals(18, UniformNumbers.countUniformIntegers(1, 99));
31+
}
32+
33+
@Test
34+
void testMultiDigitRangeWithUniformNumbers() {
35+
assertEquals(1, UniformNumbers.countUniformIntegers(100, 111));
36+
assertEquals(2, UniformNumbers.countUniformIntegers(111, 222));
37+
}
38+
39+
@Test
40+
void testExactUniformBoundary() {
41+
assertEquals(1, UniformNumbers.countUniformIntegers(111, 111));
42+
assertEquals(2, UniformNumbers.countUniformIntegers(111, 222));
43+
}
44+
45+
@Test
46+
void testLargeRange() {
47+
assertEquals(27, UniformNumbers.countUniformIntegers(1, 999));
48+
assertEquals(36, UniformNumbers.countUniformIntegers(1, 9999));
49+
}
50+
51+
@Test
52+
void testInvalidRange() {
53+
assertEquals(0, UniformNumbers.countUniformIntegers(500, 100));
54+
assertEquals(0, UniformNumbers.countUniformIntegers(-100, -1));
55+
}
56+
}

0 commit comments

Comments
 (0)