Java 我的一个测试案例没有通过。给一个案例一个TLE

Java 我的一个测试案例没有通过。给一个案例一个TLE,java,string,object,time,stack,Java,String,Object,Time,Stack,问题陈述来自hackerrank。 名称:简单文本编辑器 说明:我使用了一个stackNode。在stackNode中,我使用了三个变量top用于上一次执行的操作,operate是k,s用于存储上一次操作中删除或追加的字符串。 问题链接 : import java.io.*; 导入java.util.*; 类堆栈节点 { int top; int运算符; 字符串s; } 公共类解决方案 { 静态字符串S=“”; 静态堆栈=新堆栈(); 公共静态void main(字符串[]args) { 扫描仪

问题陈述来自hackerrank。

名称:简单文本编辑器
说明:我使用了一个stackNode。在stackNode中,我使用了三个变量top用于上一次执行的操作,operate是k,s用于存储上一次操作中删除或追加的字符串。

问题链接 :

import java.io.*;
导入java.util.*;
类堆栈节点
{
int top;
int运算符;
字符串s;
}
公共类解决方案
{
静态字符串S=“”;
静态堆栈=新堆栈();
公共静态void main(字符串[]args)
{
扫描仪sc=新的扫描仪(System.in);
int t=sc.nextInt();
而(t-->0)
{
int operation=sc.nextInt();
如果(操作==1)
{
字符串st=sc.next();
S=S+st;
StackNode节点=新的StackNode();
node.top=操作;
node.s=st;
栈推(节点);
}
其他的
如果(操作==2)
{
int k=sc.nextInt();
删除(k,操作);
}
其他的
如果(操作==3)
{
int k=sc.nextInt();
印刷品(k);
}
其他的
如果(操作==4)
撤消();
}
}
静态无效删除(int k,int操作)
{
StackNode节点=新的StackNode();
node.top=操作;
node.operat=k;
如果(S.长度()如果(k问题:在每个附加和删除操作中复制整个编辑器内容需要很长时间,而字符串很长。解决方案:使用
StringBuffer
StringBuilder
而不是将编辑器内容保留在
字符串中

编辑器的内容可能最多为一百万个字符。以下每个代码行都将此内容复制到一个新的
字符串中

        S=S+st;

    S=S.substring(0,S.length()-k);

    S=S.substring(0,S.length()-node.s.length());

    S=S+node.s;
相反,当您附加到
StringBuffer
StringBuilder
或从中删除时,操作中未涉及的字符可以保留在原位

其他可能的轻微优化:

  • 在撤消堆栈上,不存储追加的字符串,只存储其长度。该长度足以撤消追加操作
  • 使用
    switch
    语句选择正确的操作,而不是链接(如果有)

  • switch和chained if else在性能方面有什么区别吗 时间复杂性与空间复杂性

    在大多数情况下,打开
    int
    值应该比使用chained更快


    文档链接:

    作为一个完整的旁白,
    java.util.Stack
    已经过时。我会使用
    ArrayList
    ArrayDeque
    作为堆栈。它可能不会对超出的时间限制产生任何影响。对于轻微的优化,不要存储附加的字符串,而只存储它的长度,这就足够了在时间复杂度和空间复杂度方面,switch和chained if else有什么区别吗
            S=S+st;
    
        S=S.substring(0,S.length()-k);
    
        S=S.substring(0,S.length()-node.s.length());
    
        S=S+node.s;