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();
}

让我们分解算法的步骤:

  1. 将整数转换为字符串,以便轻松遍历每个数字。
  2. 遍历字符串中的每个字符,并添加到 HashSet 中。
  3. 遍历结束后,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();
}

步骤如下:

  1. 将数字转换为字符串。
  2. 使用字符串的 chars() 方法获取字符流。
  3. 使用 distinct() 方法过滤掉重复的数字。
  4. 使用 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);
}

以下是代码的步骤:

  1. 初始化一个整数 mask 为 0,mask 的每一位代表 0-9 的一个数字。
  2. 遍历整数的每个数字。
  3. 对于每个数字,创建一个位表示。如果数字是 d,那么位表示就是 1 << d。
  4. 使用按位或更新 mask,标记数字已看到。
  5. 计算 mask 中设置为 1 的位数。这个计数即为独特数字的数量。

时间复杂度也与上述解决方案相同。

6. 总结

本文提供了几种计算整数中唯一数字数量的方法,以及它们的时间复杂性。

本文示例代码可在 GitHub 查看。