Почему OJ сообщает об ошибке выполнения для этого куска кода? - PullRequest
0 голосов
/ 10 марта 2012

Я недавно начал пробовать POJ с использованием Java. Я столкнулся с проблемой (также доступна здесь на UVa), которая известна как Восстановление дерева .Здесь мой код:

import java.util.Scanner;

публичный класс 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 голосов
/ 10 марта 2012

Возможно, на ядре запущены тестовые случаи, отличные от тех, которые вы пробовали, и ваш код имеет дефект, который приводит к ошибке времени выполнения в этих случаях. Это может быть вызвано каким-то незаконным доступом.

Например;

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).

Можете ли вы вспомнить какие-либо данные о том, что эти строки могут потерпеть неудачу? Вы, вероятно, пытаетесь получить доступ к индексу в массиве или строке, которая не существует. Протестируйте свой код на предмет таких угловых случаев.

...