【问题标题】:My one test case is not passing .Giving TLE for one case我的一个测试案例没有通过。为一个案例提供 TLE
【发布时间】:2020-08-29 06:01:57
【问题描述】:

问题陈述来自hackerrank。

名称: 简单文本编辑器
描述: 我取了一个 stackNode.in stackNode 我使用了三个变量 top 是为之前执行的操作操作是 k 和 s用于存储在先前操作中删除或附加的字符串。

问题链接https://www.hackerrank.com/challenges/simple-text-editor/problem?isFullScreen=false

import java.io.*;
import java.util.*;
class StackNode
{
int top;
int operat;
String s;
}
public class Solution 
{
static String S="";
static Stack<StackNode> stack=new Stack<>();
public static void main(String[] args) 
{
    Scanner sc=new Scanner(System.in);
    int t=sc.nextInt();
    while(t-- >0)
    {
        int operation=sc.nextInt();
        if(operation == 1)
        {
            String st=sc.next();
            S=S+st;
            StackNode node=new StackNode();
            node.top=operation;
            node.s=st;
            stack.push(node);
        }
        else
        if(operation == 2)
        {
            int k=sc.nextInt();
            delete(k,operation);
        }
        else
        if(operation == 3)
        {
            int k=sc.nextInt();
            print(k);
        }
        else
        if(operation == 4)
           undo();
    }
}
static void delete(int k,int operation)
{
    StackNode node=new StackNode();
    node.top=operation;
    node.operat=k;
    if(S.length() < k)
    {
        node.s=S;
        S="";
        return;
    }
    else
    {
        node.s=S.substring(S.length()-k);
        S=S.substring(0,S.length()-k);
    }
    stack.push(node);
    }
    static void print(int k)
{
    if(k<=S.length())
       System.out.println(S.charAt(k-1));
}
static void undo()
{
    if(stack.isEmpty())
      return;
    StackNode node=stack.pop();
    if(node.top == 1)
    {
        S=S.substring(0,S.length()-node.s.length());
    }
    else
    if(node.top == 2)
    {
        S=S+node.s;
    }
   }
}

【问题讨论】:

  • 顺便说一句,java.util.Stack 已经过时了。我会使用ArrayListArrayDeque 作为堆栈。 超过时间限制可能没有区别。对于轻微的优化,不要存储附加的字符串,只存储它的长度,这足以撤消附加。

标签: java string object time stack


【解决方案1】:

问题:当字符串很长时,在每次追加和删除操作时复制整个编辑器内容需要很长时间。 解决方案:不要将编辑器内容保存在String 中,而是使用StringBufferStringBuilder

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

        S=S+st;

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

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

    S=S+node.s;

当您改为追加或删除StringBufferStringBuilder 时,未参与操作的字符可以保留在原位。

其他可能的轻微优化:

  1. 在撤消堆栈上不存储附加的字符串,而只存储它的长度。该长度足以撤消附加操作。
  2. 使用 switch 语句来选择正确的操作,而不是使用链式 if-else。

switch 和链式 if-else 在以下方面有什么区别吗? 时间复杂度和空间复杂度

在大多数情况下,int 值的开启应该比链式 if-else 更快。

文档链接: StringBuilder

【讨论】:

  • switch和链式if-else在时间复杂度和空间复杂度上是否有区别
猜你喜欢
  • 2016-10-09
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-13
相关资源
最近更新 更多