Kattis Yoda题Java提交通过8用例,第9个出现运行时错误求排查
Kattis《Yoda》题目Java实现运行时错误排查
我用Java实现了Kattis平台的《Yoda》题目,提交后成功通过8个测试用例,但第9个测试用例出现运行时错误。自行测试多组用例(包括题目给定测试用例)均得到预期结果,但无法定位代码问题。以下是我的实现代码:
import java.util.Scanner; public class kattis_yoda { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int num1 = scan.nextInt(); int num2 = scan.nextInt(); scan.close(); String s1 = ""; String s2 = ""; s1 = Integer.toString(num1); s2 = Integer.toString(num2); int l1 = s1.length(); int l2 = s2.length(); String res1 = ""; String res2 = ""; for(int i = 0; i < s1.length() && i < s2.length(); i++){ char ch1 = s1.charAt(l1-1); char ch2 = s2.charAt(l2-1); int a = Character.getNumericValue(ch1); int b = Character.getNumericValue(ch2); if(a == b) { res1 = Integer.toString(a) + res1; res2 = Integer.toString(b) + res2; } else if(a > b) res1 = Integer.toString(a) + res1; else res2 = Integer.toString(b) + res2; l1 -= 1; l2 -= 1; } if(l1 > l2) { int temp = l1; for(int i = 0; i < l1; i++){ char ch1 = s1.charAt(l1-1); int a = Character.getNumericValue(ch1); res1 = Integer.toString(a) + res1; l1 -= 1; } l1 = temp; } if(l2 > l1) { for(int i = 0; i < l2; i++){ char ch1 = s2.charAt(l2-1); int a = Character.getNumericValue(ch1); res2 = Integer.toString(a) + res2; l2 -= 1; } } if(res1.length() != 0 && res2.length() != 0) { num1 = Integer.parseInt(res1); num2 = Integer.parseInt(res2); System.out.println(num1); System.out.println(num2); } else if(res1.length() == 0 && res2.length() == 0) { System.out.println("YODA"); System.out.println("YODA"); } else if(res1.length() == 0 && res2.length() != 0) { num2 = Integer.parseInt(res2); System.out.println("YODA"); System.out.println(num2); } else { num1 = Integer.parseInt(res1); System.out.println(num1); System.out.println("YODA"); } } }
代码存在的问题
1. 输入值超出int类型范围导致溢出
题目中的输入可能包含远大于int最大值(2147483647)的数字,用scan.nextInt()读取会直接抛出NumberFormatException,这就是第9个测试用例运行时错误的核心原因。应该直接用String类型读取输入,避免数值转换时的溢出问题。
2. 剩余数字处理的循环逻辑错误
当其中一个数字长度更长时,处理剩余高位数字的循环条件错误:
- 以
l1 > l2的情况为例,循环条件i < l1中,l1在循环内不断递减,导致实际循环次数和预期不符。比如初始l1=3,循环会执行3次,但实际上剩余的高位数字应该是原字符串的前l1位(即索引0到l1-1),正确的做法是直接截取子串或者按固定索引遍历。
3. 结果转换Integer.parseInt()可能溢出
即使输入处理正确,最终结果res1或res2也可能超出int范围,用Integer.parseInt()转换同样会抛出异常,应该直接输出字符串(如果结果为空则输出YODA),不需要转成int。
修正后的代码示例
import java.util.Scanner; public class kattis_yoda { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 直接读取字符串,避免int溢出 String s1 = scan.next(); String s2 = scan.next(); scan.close(); int l1 = s1.length(); int l2 = s2.length(); StringBuilder res1 = new StringBuilder(); StringBuilder res2 = new StringBuilder(); // 从末尾开始逐位比较 while (l1 > 0 && l2 > 0) { char ch1 = s1.charAt(--l1); char ch2 = s2.charAt(--l2); int a = ch1 - '0'; int b = ch2 - '0'; if (a == b) { res1.append(ch1); res2.append(ch2); } else if (a > b) { res1.append(ch1); } else { res2.append(ch2); } } // 处理剩余的高位数字 while (l1 > 0) { res1.append(s1.charAt(--l1)); } while (l2 > 0) { res2.append(s2.charAt(--l2)); } // 反转得到正确顺序,判断输出 String result1 = res1.length() == 0 ? "YODA" : res1.reverse().toString(); String result2 = res2.length() == 0 ? "YODA" : res2.reverse().toString(); System.out.println(result1); System.out.println(result2); } }
修正说明
- 直接用
String读取输入,彻底避免数值溢出问题; - 使用
StringBuilder拼接结果,比字符串直接拼接更高效; - 用
while循环处理剩余数字,逻辑更清晰,避免索引错误; - 结果直接输出字符串,不需要转成
int,避免转换时的溢出异常; - 通过反转
StringBuilder得到正确的数字顺序。
内容的提问来源于stack exchange,提问作者noobProgrammer
相关产品推荐
相关产品推荐

