Как я могу уменьшить время выполнения для этого кода - PullRequest
0 голосов
/ 04 октября 2019
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);
        }
    }

}

В этой программе я создал Linked List фиксированного размера, в котором при добавлении значений, превышающих размер списка, он удаляет старое значение и добавляет новое значение в Last.

Предлагает некоторые изменения в кодебез изменения логики. Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

Класс сканера медленный для больших входов, поэтому старайтесь избегать его. Вы можете использовать класс BufferedReader, который работает быстрее, чем класс Scanner.

Scanner - гораздо более мощная утилита, чем BufferedReader, но BuffredReader имеет значительно больший буфер (8 КБ), чем Scanner (1 КБ), а также Scanner использует регулярное выражение для чтения. и анализировать ввод текста, что делает его медленным.

2 голосов
/ 04 октября 2019

contains() LinkedList имеет время O (n) в худшем случае.

Для этого создайте вспомогательное HashSet или придумайте другой способ отследить уже появившиеся элементы.

0 голосов
/ 04 октября 2019

Вызов queue.size в методе main. Вы можете сохранить один расчет, если вызовете его один раз и сохраните его значение, а затем повторно используйте в операторе sysout и в цикле for.

Избегайте обобщений импорта. Ex. import java.io. * Поместите именно те пакеты, к которым вы хотите получить доступ. Это также может сэкономить немного времени.

...