【问题标题】:How to optimize my code to make it faster?如何优化我的代码以使其更快?
【发布时间】:2014-02-21 11:17:10
【问题描述】:

我目前正在处理在线法官的问题。但是,我的代码一直超过 TimeLimit,只有 1 秒。我使用了Scanner 和System.out.print(),但是我被告知这样的方法会使我的代码变慢并且会消耗更多的内存,这就是我缓冲输入和输出的方式。我不能使用诸如long 或int 之类的类型,因为存储变量的数据比这些值长。

代码如下:

import java.io.*;
import java.math.BigDecimal;

class Main {
    public static void main(String[] args) throws NumberFormatException, IOException{
        java.io.InputStreamReader iSR = new java.io.InputStreamReader(System.in);
        java.io.BufferedReader bR = new java.io.BufferedReader(iSR, 16 * 1024);
        BufferedWriter bW = new BufferedWriter(new OutputStreamWriter(System.out));
        String tL;
        BigDecimal PRA = BigDecimal.ZERO, PRB = BigDecimal.ZERO, PA = BigDecimal.ZERO, PB = BigDecimal.ZERO;
        int input = Integer.parseInt(bR.readLine());
        for(int j = 0; j < input; j++){
            tL = bR.readLine();
            String [] = arr = tL.split(" ");
            PA = BigDecimal.valueOf(Integer.parseInt(arr[0]));
            PB = BigDecimal.valueOf(Integer.parseInt(arr[1]));
            PRA = BigDecimal.valueOf(Double.parseDouble(arr[2]));
            PRB = BigDecimal.valueOf(Double.parseDouble(arr[3]));
            PRA = PRA.divide(BigDecimal.valueOf(100)); PRA = PRA.add(BigDecimal.ONE);
            PRB = PRB.divide(BigDecimal.valueOf(100)); PRB = PRB.add(BigDecimal.ONE);
            int i = 1;
            while(PA.compareTo(PB) < 0 && i < 103){
                BigDecimal ibd = BigDecimal.valueOf(i);
                PA = PA.multiply(PRA).multiply(ibd);
                PB = PB.multiply(PRB).multiply(ibd);
                i++;
            }
            i--;
            if(i > 100) bW.write("Mais de 1 seculo.\n");
            else bW.write(String.valueOf(i) + " anos.\n");
            bW.flush();
        }
    }
}

【问题讨论】:

  • "I am currently working on a problem of an online judge." -- 如果这是在线比赛,你不应该自己解决这个问题吗?只是想知道。
  • @HovercraftFullOfEels 不是比赛。我只是在练习,谢谢你的疑惑。
  • 这是什么鬼……
  • 制作 j 个 bufferedwriter 实例没有帮助。
  • 这是一个代码审查问题。它确实属于 Code Review 讨论而不是 Stack Overflow。

标签: java optimization


【解决方案1】:

一点..

您不应该多次使用tL.split("\\s")。只需执行一次,将其分配给一个变量并使用它。

【讨论】:

  • 实际上,如果我听从您的建议,我会创建一个新实例,但这无济于事。感谢您的帮助。
  • @Hans:因此,按照自己的方式进行操作,您将创建四个新实例而不是一个。 Can't Tell 的方式显然更好,而且明显确实有帮助。
  • @HovercraftFullOfEels 我没有创建 5 个实例,而是创建了 4 个。
  • @Hans:不,您正在创建四个而不是一个! 1+到不能说。请听从他的建议。
  • @HovercraftFullOfEels 好吧,也许我很困惑,我应该创建一个数组吗?
猜你喜欢
  • 2020-05-29
  • 2016-05-07
  • 2020-01-13
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多