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
即可立即永久解锁本站全部文章
