gpt4 book ai didi

java - 在线裁判的问题处理输入

转载 作者:行者123 更新时间:2023-12-02 00:55:23 24 4
gpt4 key购买 nike

这与我之前的 question 有关

我正在解决UVA的编辑阶梯问题,并试图让在线法官遵守我的答案。

我已经使用 ReadLn() 方法来调整我的文本文件读取程序:

import java.io.*;
import java.util.*;

class LevenshteinParaElJuez implements Runnable{
static String ReadLn(int maxLength){ // utility function to read from stdin,
// Provided by Programming-challenges, edit for style only
byte line[] = new byte [maxLength];
int length = 0;
int input = -1;
try{
while (length < maxLength){//Read untill maxlength
input = System.in.read();
if ((input < 0) || (input == '\n')) break; //or untill end of line ninput
line [length++] += input;
}

if ((input < 0) && (length == 0)) return null; // eof
return new String(line, 0, length);
}catch (IOException e){
return null;
}
}

public static void main(String args[]) // entry point from OS
{
LevenshteinParaElJuez myWork = new LevenshteinParaElJuez(); // Construct the bootloader
myWork.run(); // execute
}

public void run() {
new myStuff().run();
}
}
class myStuff implements Runnable{
public void run(){

ArrayList<String> theWords = new ArrayList<String>();
try
{

/// PLACE YOUR JAVA CODE HERE

String leido=LevenshteinParaElJuez.ReadLn(100);

//System.out.println("lo leido fue "+leido);

while (!leido.equals(" ")){
theWords.add(leido);
leido=LevenshteinParaElJuez.ReadLn(100);
}


}catch(Exception e){
System.out.println("El programa genero una excepcion");
}


int maxEdit=0;
int actualEdit=0;

int wordsIndex1 =0, wordsIndex2=0;


while (wordsIndex1<= theWords.size())
{
while (wordsIndex2<= theWords.size()-1){
actualEdit=Levenshtein.computeLevenshteinDistance(theWords.get(wordsIndex1),theWords.get(wordsIndex2));
if (actualEdit>maxEdit){maxEdit=actualEdit;}
wordsIndex2++;
}
wordsIndex1++;

}

System.out.println(maxEdit+1);



}


}
class Levenshtein {
private static int minimum(int a, int b, int c) {
if(a<=b && a<=c)
return a;
if(b<=a && b<=c)
return b;
return c;
}

public static int computeLevenshteinDistance(String str1, String str2) {
return computeLevenshteinDistance(str1.toCharArray(),
str2.toCharArray());
}

private static int computeLevenshteinDistance(char [] str1, char [] str2) {
int [][]distance = new int[str1.length+1][str2.length+1];

for(int i=0;i<=str1.length;i++)
distance[i][0]=i;

for(int j=0;j<=str2.length;j++)
distance[0][j]=j;

for(int i=1;i<=str1.length;i++)
for(int j=1;j<=str2.length;j++)
distance[i][j]= minimum(distance[i-1][j]+1,
distance[i][j-1]+1,
distance[i-1][j-1]+
((str1[i-1]==str2[j-1])?0:1));

return distance[str1.length][str2.length];
}


}

我应该读取在线法官的全部输入,因为它是通过键盘编写的,但是当我运行上面的程序时,我无法让它停止读取。它是这样的:

abc
cba
aba
cca

无法停止控制台读取。我该如何解决这个问题?我怀疑问题出在循环的条件中:

String leido=LevenshteinParaElJuez.ReadLn(100);

//System.out.println("lo leido fue "+leido);

while (!leido.equals(" ")){
theWords.add(leido);
leido=LevenshteinParaElJuez.ReadLn(100);
}

我还用过:

while (!leido.equals(null)){
theWords.add(leido);
leido=LevenshteinParaElJuez.ReadLn(100);
}

也被卡住了。

编辑:声明实际上是:

while (leido != null)){
theWords.add(leido);
leido=LevenshteinParaElJuez.ReadLn(100);
}

我不明白为什么它失败了。我希望在输入第一个空行时停止通过键盘读取输入。

编辑:感谢 rodion 的回答,ReadLn 方法现在更改为:

if ((input < 0) || (length == 0)) return null;  // eof

而不是:

if ((input < 0) && (length == 0)) return null;  // eof

现在,它在生成整数输出之前读取两个空格。我怎样才能改变它只读一个?

最佳答案

问题是输入到达返回 null 的行时不会是 <0,所以这样做:

while (leido.length() != 0) {
....
}

关于java - 在线裁判的问题处理输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/929802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com