1. 概述
在这个简短教程中,我们将探讨如何使用 Java 来计算一个整数中唯一数字的数量。
2. 问题理解
给定一个整数,我们的目标是计算它包含多少个独特的数字。例如,整数 567890 包含六个唯一的数字(1, 5, 6, 7, 8, 和 9),而 115577 只有三个独特的数字(1, 5, 和 7)。
3. 使用 Set
找到整数中唯一数字数量的最直接方法是使用 Set。Set 的特性可以自动消除重复项,非常适合我们的需求:
public static int countWithSet(int number) {
number = Math.abs(number);
Set<Character> uniqueDigits = new HashSet<>();
String numberStr = String.valueOf(number);
for (char digit : numberStr.toCharArray()) {
uniqueDigits.add(digit);
}
return uniqueDigits.size();
}
让我们分解算法的步骤:
- 将整数转换为字符串,以便轻松遍历每个数字。
- 遍历字符串中的每个字符,并添加到 HashSet 中。
- 遍历结束后,HashSet 的大小即为我们所求的独特数字数量。
这个解决方案的时间复杂度为 *O(n)*,其中 n 是整数中的位数。向 HashSet 添加元素和获取其大小都是 O(1) 的操作,但我们仍然需要遍历每个数字。
4. 使用流 API
Java 的 流 API 提供了一种简洁现代的方法来计算整数中唯一数字的数量。这种方法利用了流的强大功能,以类似集合的方式处理元素序列,包括去除重复元素:
public static long countWithStreamApi(int number) {
return String.valueOf(Math.abs(number)).chars().distinct().count();
}
步骤如下:
- 将数字转换为字符串。
- 使用字符串的 chars() 方法获取字符流。
- 使用 distinct() 方法过滤掉重复的数字。
- 使用 count() 方法获取唯一数字的数量。
时间复杂度与第一个解决方案相同。
5. 使用位操作
让我们再探索一种方法。位操作也可以用来追踪唯一数字:
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);
}
以下是代码的步骤:
- 初始化一个整数 mask 为 0,mask 的每一位代表 0-9 的一个数字。
- 遍历整数的每个数字。
- 对于每个数字,创建一个位表示。如果数字是 d,那么位表示就是 1 << d。
- 使用按位或更新 mask,标记数字已看到。
- 计算 mask 中设置为 1 的位数。这个计数即为独特数字的数量。
时间复杂度也与上述解决方案相同。
6. 总结
本文提供了几种计算整数中唯一数字数量的方法,以及它们的时间复杂性。
本文示例代码可在 GitHub 查看。