Skip to content

Commit d1c1e6b

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

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed

DIRECTORY.md

Lines changed: 4 additions & 0 deletions
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)
Lines changed: 50 additions & 0 deletions
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+
}
Lines changed: 56 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy