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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:22:39