1

我正在使用 Java 来解决 SPOJ ( http://www.spoj.pl ) 问题,其中很多显然是使用控制台输入。问题是,他们中的一些人没有说会有多少行输入,所以当没有更多内容时关闭程序由我决定。我正在使用扫描仪:

Scanner s = new Scanner(System.in);
String str = s.nextLine();

不幸的是,它不会读取下一行,但是...等待用户输入,然后获取下一行。这也适用于

s.hasNext();

所以我不知道什么时候完成这个程序。有没有办法在不等待的情况下读取输入行?

4

4 回答 4

1

为他们提供输入规范几乎是竞赛编程问题的标准(我相信你知道)。我浏览了网站上的一些问题,它们都被指定了。您是否有指向没有完整规范的问题的链接?

在这种情况下,向管理员发送电子邮件以更新规范会很有用。除此之外,Scanner.hasNextLine()如果您已到达输入的末尾,则应返回 false。

更新输入正在从文件中传输,因此hasNextLine()应按需要运行。到目前为止它对你没有用吗?您确定您的代码不会以其他方式花费太长时间吗?

于 2012-10-10T08:36:10.170 回答
0

你做错了。您必须继续阅读,直到没有更多输入,其中输入的结尾被定义为空。等待超时所花费的时间将导致您的代码无法通过 spoj 测试 - spoj 对速度非常严格。

说我给你以下问题:

给定一个整数列表,每个整数占一行,打印出所有整数的总和。

1
2
3
4
5

我们不知道是否或何时会有更多意见。关键是没有人坐在那里输入数字。输入直接从文件通过管道传输到程序,并且将以 null 结尾(就像文件一样)。

对 spoj 有用的内容如下:

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line = "";
    int sum = 0;
    while ((line = br.readLine()) != null) {
        sum += Integer.parseInt(line);
    }
    System.out.println(sum);

如果我遗漏了一些奇怪的 spoj 案例,我请求你用 spoj 问题对此发表评论,我会告诉你如何阅读输入。绝对不是计时器或线程或任何愚蠢的东西。

于 2012-10-10T08:38:32.303 回答
0

如果您不使用智能算法来找到解决方案,有些问题会花费太多时间。我建议:

  • 首先,要确切知道输入是如何给出的
  • 然后,准确理解NZEC(和其他错误代码)的含义。他们有一个论坛
  • 此时,如果您的程序在执行时仍然被杀死,这仅意味着您需要找到一个更好的算法,它会花费更少的时间。

我建议将输入流作为执行工作的函数的参数传递,并将文件作为程序的可选参数。创建多个文件输入,在文件输入流上测试您的代码,并尝试检测影响程序运行时间的因素。

于 2012-10-10T09:04:30.477 回答
-1

做一个定时器变量

Scanner s = new Scanner(System.in);
// Start timer here
String str = s.nextLine();
//If a next line is read, reset timer.

向计时器添加一个事件,以便如果它到期,您的程序将关闭。

于 2012-10-10T08:13:44.560 回答