如何优化给定代码

时间:2018-09-30 03:47:53

标签: java

给定代码的时间限制必须少于1.824秒。在给定代码以下的时间超过此限制。我可以添加或替换哪些内容,以使代码得到优化并在该时间限制内运行。 下面的代码通过删除字符串中的'spaces'和特殊字符来检查给定的字符串是否为pallindrome。在删除特殊字符后,字符串mus仅保留字母。 示例: 输入: 2 我是:铁我马,我 Ab / Ba 输出: 是 是的

代码:

public static void main (String[] args) throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    int T=Integer.parseInt(br.readLine());
    while(T-->0)
    {
        String frog=br.readLine().replaceAll("\\s+","").replaceAll("[^\\w]","");
        String news="";
        char ch;
        for(int i=0;i<frog.length();i++)
        {
            ch=frog.charAt(i);
            news=ch+news;
        }
        if(news.equalsIgnoreCase(frog))
        System.out.println("YES");
        else
        System.out.println("NO");

    }
}

}

2 个答案:

答案 0 :(得分:4)

这似乎是一项家庭作业,所以我不会为您提供代码,我只会指导您如何改进方法。

您的方法是线性的,您反转字符串,然后将反转与原始字符串进行比较。尽管这是一种正确的方法,但您需要进行过多的操作。

假定字符串的长度为N,另一种方法是简单地循环N / 2次,并且每次将第i个字符与第N个第i个字符进行比较。如果有任何字符不匹配,请打印“否”并中断,否则继续进行比较。如果所有字符都匹配,则打印是。

Mead的解决方案与您的解决方案几乎相同,尽管它减少了最初的过滤操作。

答案 1 :(得分:0)

使用单个正则表达式代替两个正则表达式,因此不必做2个replaceAll()和一个StringBuilder,因为每个串联都创建一个新的String(字符串是不可变的)

public static final void main (final String[] args) throws IOException
{
    final BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    int T=Integer.parseInt(br.readLine());
    final StringBuilder sb = new StringBuilder();
    String frog;
    while(T-->0)
    {
        frog = br.readLine().replaceAll("\\s+|[^\\w]","");
        for(int i=frog.length()-1;i!=-1;i++)
        {
            sb.append(frog.charAt(i));
        }
        if(sb.toString().equalsIgnoreCase(frog))
        System.out.println("YES");
        else
        System.out.println("NO");
        sb.setLength(0);
    }
}