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

HackerRank上Java多态测试特定用例失败,求排查原因

问题分析与修复方案

1. 快乐数范围遗漏结束元素

ChildTwo的filter方法中,循环条件为i < endElement,而质数筛选的filter方法用的是i <= endElement,这直接导致快乐数列表不会包含结束元素,比如测试用例(1,5555)会漏掉对5555的检查,结果自然不符合预期。

修复:将ChildTwo的循环条件改为i <= endElement。

2. 输入读取方式不匹配平台格式

你的程序假设输入是两行分别输入两个整数,但HackerRank这类平台的范围输入通常是一行内用空格分隔两个整数。如果平台输入是一行两个数,第二个scanner.nextLine()会读取空字符串,触发NumberFormatException导致程序崩溃。

修复:改用scanner.nextInt()读取整数,无需关心换行:

Scanner scanner = new Scanner(System.in);
a = scanner.nextInt();
b = scanner.nextInt();

3. 字符串拼接效率过低(大概率是大测试用例超时的原因)

用result += (" " + i)拼接字符串时,每次操作都会创建新的String对象,当范围很大(比如1到5555)时,会产生大量临时对象,直接导致运行超时。

修复:改用StringBuilder构建结果,以ChildOne的filter为例:

@Override
String filter(){
    StringBuilder result = new StringBuilder();
    for(int i = startElement; i <= endElement; i++){
        if(isPrime(i)){
            if(result.length() > 0){
                result.append(" ");
            }
            result.append(i);
        }
    }
    return result.toString();
}

ChildTwo的filter方法做同样修改。

4. 质数判断的性能优化(可选但必要)

当前质数判断循环到num/2,可以优化为循环到Math.sqrt(num),大幅减少循环次数,提升大区间的运行速度:

public boolean isPrime(int num){
    if(num == 1)
        return false;
    if(num == 2)
        return true;
    if(num % 2 == 0)
        return false;
    for(int i = 3; i <= Math.sqrt(num); i += 2){
        if(num % i == 0){
            return false;
        }
    }
    return true;
}

5. 快乐数计算的冗余调用(不影响结果但浪费性能)

isHappy方法中先调用一次squareSum(num),再进入循环重复计算,多了一次不必要的调用,在大区间下会累积额外耗时。

修复:调整逻辑直接从初始值开始判断:

public boolean isHappy(int num){
    int check = num;
    while(true){
        check = squareSum(check);
        if(check == 1)
            return true;
        else if(check == 4)
            return false;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:33:18