为什么OJ报告这段代码的运行时错误?

时间:2012-03-10 13:30:45

标签: java algorithm runtime-error

我最近开始使用Java尝试POJ。我遇到problem(在UVa上也可用here),它被称为树恢复。这是我的代码:

import java.util.Scanner;

public class Main {

static String pre, in;
static char[] post = new char[100];
static int len;

public static void solve(int p1, int p2, int m1, int m2) {
    if (p1 > p2)
        return;
    int i;
    for (i = m1; i <= m2; i++) {
        if(in.charAt(i)==pre.charAt(p1))
            break;
    }
    post[--len] = pre.charAt(p1);
    if (p1 == p2)
        return;
    solve(p1 + (i + 1) - m1, p2, i + 1, m2);
    solve(p1 + 1, p1 + i - m1, m1, i - 1);
}

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while (sc.hasNextLine()) {
        pre = sc.next();
        in = sc.next();
        len = pre.length();
        solve(0, len - 1, 0, len - 1);
        System.out.println(post);
    }
}

}

使用eclipse的默认编译选项,代码在给定的测试用例上运行良好。但是当我提交时,它会报告运行时错误。我想知道这是怎么回事。谢谢。

1 个答案:

答案 0 :(得分:0)

也许引擎运行的测试用例与您尝试的不同,并且您的代码有一个缺陷,会在这些情况下产生运行时错误。这很可能是由某种非法访问造成的。

例如;

while (sc.hasNextLine()) {
    pre = sc.next();
    in = sc.next();
...
}

看起来很可疑。经过一次sc检查后,您确定next()有两个hasNextLine()可用吗?

此外;检查数组索引:if(in.charAt(i)==pre.charAt(p1))post[--len] = pre.charAt(p1)。您可以尝试在每行之前使用断言:assert(post.length < len - 1 && pre.length() < p1)

你能想到那些线路可能会失败的输入吗?您可能正在尝试访问不存在的数组或字符串的索引。针对此类案例测试您的代码。