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);
}
}
}
在此程序中,我创建了固定大小的链接列表,其中在添加大于列表大小的值时,它会删除旧值并在最后添加新值。
建议在不更改逻辑的情况下对代码进行一些更改。预先感谢
答案 0 :(得分:2)
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. * 放入您要专门访问的软件包。 这样可以节省一点时间。