我正在使用spoj解决PALIN,但即使它正在使用ideone,我也会收到NZEC错误

时间:2017-06-22 10:55:45

标签: java adhoc

当从左到右和从右到左读取十进制系统中的表示时,正整数称为回文。对于给定的正整数K不超过1000000位,写入大于K的最小回文值输出。始终显示的数字不带前导零。

public class Client {

public static void main(String[] args) throws Exception {

    try {
        Socket sock = new Socket("localhost", 5151);
        String msg = "Hello, I am a Client.";

        if(sock.isConnected()) {
            System.out.println("Connected to server!");
        }

        OutputStream ostream = sock.getOutputStream();
        DataOutputStream dos = new DataOutputStream(ostream);
        dos.writeBytes(msg);

        InputStream istream = sock.getInputStream();
        BufferedReader br1 = new BufferedReader(new InputStreamReader(istream));
        String msgBack = br1.readLine();

        System.out.println(msgBack);

        br1.close();
        dos.close();
        ostream.close();
        sock.close();
    } catch(Exception e) {
        System.out.println("Could not conenct to server.");
    }
}

我是编程的初学者。我正在尝试在spoj上解决这个问题#PALIN,但即使它正在处理ideone,我也会遇到运行时错误。请帮助我

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题,但最大的问题是您在可以表示{em>远范围之外的字符串Integer.parseInt上调用int。说明说输入可以达到一百万个数字,这意味着你在最多50万个数字的字符串上调用Integer.parseInt - 意思是,字符串最多10个 500000 -1 - 但int s仅上升到2 31 -1,小于10 10

修复后,您可以通过执行以下操作来测试代码:

  • 将实际计算结果的逻辑分解为自己的方法,并使用String computeNextPalindrome(String s)之类的签名。这样,您可以通过以编程方式调用它并检查其结果来测试该方法,而不是乱用标准输出。
  • 编写一个方法,将expectedResult初始化为computeNextPalindrome("99999")的预期结果(即"100001"),然后从99999向下迭代到1,验证computeNextPalindrome始终返回expectedResult。每次验证后,检查当前号码是否为回文,如果是,请将expectedResult更新为当前号码。

这样,您可以详尽地测试您的逻辑对于最多五位数的所有数字是否正确。除了上面提到的错误之外,关于尝试将int用于远远超出int范围的值,大多数错误都会出现在某些小案例中。有一个只影响大值的bug是相当不寻常的;因此,通过详尽地测试小值,您几乎可以找到所有错误。

然后,您可以通过对一些较大的值进行抽样检查来检查特定于较大值的错误,例如"1234567890123456789012345678901234568790"(应该为"1234567890123456789119876543210987654321")。