使用Java计算整数中不同数字的数量

2025/04/10

1. 概述

在这个简短的教程中,我们将探讨如何使用Java计算整数中唯一数字的数量。

2. 理解问题

给定一个整数,我们的目标是计算它包含多少个唯一数字。例如,整数567890有6个唯一数字,而115577只有3个唯一数字(1、5和7)。

3. 使用集合

查找整数中唯一数字的个数的最直接方法是使用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.使用Stream API

Java的Stream 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);
}

以下是我们这次代码的步骤:

  • 将整数掩码初始化为0,掩码中的每一位代表0-9之间的一个数字
  • 遍历数字的每个数字
  • 为每个数字创建一个位表示,如果数字是d,则位表示为1 « d
  • 使用按位或运算来更新mask,这会将数字标记为可见
  • 计算mask中设置为1的位数,该计数即为唯一数字的数量

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

6. 总结

本文提供了计算整数中不同数字数量的不同方法及其时间复杂度。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章