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
相关产品推荐
相关产品推荐

