如何减少此代码的执行时间

时间:2019-10-04 16:42:22

标签: java algorithm performance execution

import java.util.*;
import java.io.*;

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Print output to STDOUT. Your class should be named Solution. */
        Scanner sc= new Scanner(System.in);
        int siz= sc.nextInt();
        int max= sc.nextInt();
        CircularQueue<Long> queue = new CircularQueue<>(max);
        while(siz-->0){
            queue.add(sc.nextLong());
        }
        System.out.println(queue.size());
        for(int i=queue.size();i>0;i--){     
                System.out.print(queue.get(i-1)+" ");                  
        }      

        } 
        public static class CircularQueue<E> extends LinkedList<E> {
            private int capacity = 10;

            public CircularQueue(int capacity){
                this.capacity = capacity;
            }

            @Override
            public boolean add(E e) {
                if(contains(e)){
                    return true;
                }
                if(size() >= capacity)
                    removeFirst();
                return super.add(e);
        }
    }

}

在此程序中,我创建了固定大小的链接列表,其中在添加大于列表大小的值时,它会删除旧值并在最后添加新值。

建议在不更改逻辑的情况下对代码进行一些更改。预先感谢

3 个答案:

答案 0 :(得分:2)

在最坏的情况下,LinkedList的

contains()的时间为O(n)。

为此目的构造辅助HashSet,或发明另一种方式来跟踪已经出现的元素。

答案 1 :(得分:2)

对于大量输入,Scanner类的速度很慢,因此请避免使用它。您可以使用比Scanner类更快的BufferedReader类。

Scanner的功能比BufferedReader强大得多,但BuffredReader的缓冲区(8KB)比Scanner(1KB)大得多,而且Scanner使用正则表达式读取和解析文本输入,这使它变慢。

答案 2 :(得分:0)

在main方法中对queue.size的调用。 如果调用一次并保存其值,则可以保存一个计算,然后在sysout语句和for循环中重复使用。

避免概括进口。例如导入java.io. * 放入您要专门访问的软件包。 这样可以节省一点时间。