首页 > 解决方案 > 谁能解释我如何克服 Java 中的 TLE 错误。我在 3 个输入中超过了时间限制,这些输入将 100000 个测试用例作为输入

问题描述

谁能解释我如何克服 Java 中的 TLE 错误。

因此,我实现了一个座位安排代码,其中第一行输入为测试用例,第二行输入为座位号。在输出中,我必须显示我的输入和座位类型 WS、AS 或 MS 的面对座位号。

例如:

2 // test cases
18 // seat number
40 // seat number
19 WS // Output
45 AS // Output

这是我实现的代码:

import java.io.*;

class Solution9
{
    public static void main(String arg[])throws Exception
    {
        int tc;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    tc=Integer.parseInt(br.readLine());
    int sno,q,r;
    String type,s="";
    for(int i=0;i<tc;i++)
    {
        sno=Integer.parseInt(br.readLine());
        sno--;
        q=sno/12;
        r=sno%12;
        int csno;
        csno=11-r;
        csno+=q*12;
        r%=6;
        if(r==0 || r==5)
            type="WS";
        else if(r==1 || r==4)
            type="MS";
        else
            type="AS";
        s=s+ (csno+1) + " " + type + "\n" ;
    }
        System.out.println(s);    
    }
}

标签: javastring

解决方案


如果您在分析器工具的控制下运行程序,您很可能会注意到大量时间花在StringBuilder您的生产线周围的活动中

s=s+ (csno+1) + " " + type + "\n" ;

反复向 a 添加一些东西String是低效的,因为它每次都执行以下操作:

  • 将现有字符串复制s到 aStringBuilder中(所花费的时间与字符串不断增加的长度成正比),
  • 将其他组件附加到StringBuilder,
  • String从内容创建一个新的StringBuilder(再次花费与内容不断增加的长度成正比的时间)。

由于您对中间字符串并不真正感兴趣,而只对最终结果感兴趣,因此请替换

String s="";

StringBuilder s=new StringBuilder();

s=s+ (csno+1) + " " + type + "\n" ;

s.append(csno+1).append(" ").append(type).append("\n");

这应该会大大提高性能。

由于StringJava 中的 s 是不可变的,因此“更改”任何有关String以某种方式创建新的String(并且可能忘记旧的)的手段。所以在StringBuilder你准备好最终结果之前最好使用 a ,因为StringBuilders 允许在不重复创建新内容的情况下更改它们的内容。


推荐阅读