You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java:如何判断数字各位是否唯一?是否有JDK方法判断全同数字?

嘿,这两个问题都是Java里处理数字各位的常见需求,我来给你详细拆解一下:

问题1:如何使用Java判断一个数字的各位数字是否互不相同?

这里有两种实用的实现思路,你可以根据场景选择:

  • 方法1:字符串结合HashSet(代码简洁易读)
    把数字转成字符串后,用HashSet来记录出现过的字符——因为Set不允许重复元素,一旦发现某个字符无法加入Set,就说明存在重复数字。
public static boolean hasUniqueDigits(int num) {
    // 处理负数,负号不影响数字本身的各位判断
    String numStr = String.valueOf(Math.abs(num));
    Set<Character> digitSet = new HashSet<>();
    
    for (char c : numStr.toCharArray()) {
        // add方法返回false表示元素已存在
        if (!digitSet.add(c)) {
            return false;
        }
    }
    return true;
}

这种方法的优势是代码直观,容易理解,而且一旦发现重复就会提前终止循环,不会做多余的操作。

  • 方法2:纯数学运算(无字符串转换,性能更优)
    如果是对性能敏感的场景,可以用取模和除法逐个取出各位数字,用一个布尔数组记录数字是否出现过(数字范围是0-9,数组大小10足够)。
public static boolean hasUniqueDigitsMath(int num) {
    num = Math.abs(num);
    boolean[] seenDigits = new boolean[10];
    
    while (num > 0) {
        int digit = num % 10;
        if (seenDigits[digit]) {
            return false;
        }
        seenDigits[digit] = true;
        num = num / 10;
    }
    return true;
}

这种方法避免了字符串对象的创建和转换开销,在高频调用的场景下表现更好。

问题2:是否存在JDK内置方法判断全相同数字?有没有更优方案?

首先明确:JDK并没有直接提供这类判断的内置方法,不过我们可以用几种比单纯循环更优雅高效的方式实现:

  • 方法1:正则表达式(最简洁)
    利用正则^(\\d)\\1*$,意思是匹配第一个数字,后面跟着任意多个和它相同的数字。代码非常简洁:
public static boolean isAllSameDigits(int num) {
    String numStr = String.valueOf(Math.abs(num));
    return numStr.matches("^(\\d)\\1*$");
}

这种方法可读性拉满,对于大多数业务场景来说,正则的匹配效率完全够用。

  • 方法2:优化版数学循环
    不需要记录所有数字,只需要记住第一个数字,然后逐个对比后续的数字是否和它一致,一旦发现不同就返回false:
public static boolean isAllSameDigitsMath(int num) {
    num = Math.abs(num);
    int firstDigit = num % 10;
    
    while (num > 0) {
        if (num % 10 != firstDigit) {
            return false;
        }
        num = num / 10;
    }
    return true;
}

这种方法逻辑简单,没有额外的存储空间开销,性能和纯循环差不多,但代码更聚焦。

  • 方法3:数字特性巧解(适合小范围整数)
    全相同的n位数字可以表示为 digit * (111...1)(n个1),而111...1等于(10^n - 1)/9。利用这个特性可以直接构造目标数字进行比较:
public static boolean isAllSameDigitsSpecial(int num) {
    num = Math.abs(num);
    if (num == 0) return true; // 0的各位都是0
    
    int digit = num % 10;
    int digitCount = String.valueOf(num).length();
    // 构造对应的全相同数字
    int targetNum = digit * (int)(Math.pow(10, digitCount) - 1) / 9;
    
    return num == targetNum;
}

注意:这种方法要小心整数溢出问题,当数字位数较多时,Math.pow转int可能会有精度丢失,所以更适合小范围的整数判断。

内容的提问来源于stack exchange,提问作者Tnadev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:33:32