web_Developer_Victor
@web_Developer_Victor
Что такое google?

Как можно оптимизировать данную программу?

Привет. У меня есть вот такая программа, но она исполняется слишком медленно. У меня есть ограничение в 1 сек и 256 MiB. Но моя программа исполняется за 1.015 сек. Как можно ее ускорить? Возможно есть что-то такое, что сразу
бросается в глаза.

Если кому-то интересно примеры входных данных
1 тест:
4 3
4 4 7 4
Результат:
4 4 4 7 или 7 4 4 4

2 тест:
7 3
3 2 1 7 4 2 1
Результат:
Oh sh*t

package mariaAndSweets;

import java.util.Collections;
import java.util.LinkedList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

final class Main {
	static final Scanner scanner = new Scanner(System.in);
	
	public static void main(String[] args) {
		final int number = scanner.nextInt(), min = scanner.nextInt();
		LinkedList<Integer> sweets = new LinkedList<>();
		LinkedList<Integer> copy = new LinkedList<>();
		
		for (int i = 0; i < number; i++) 
			sweets.add(scanner.nextInt());
		scanner.close();

		Set<Integer> set = new HashSet<>(sweets);
		copy.addAll(set);
		
		for (int i = 0; i < copy.size(); i++) {
			if (Collections.frequency(sweets, copy.get(i)) >= min) {
				Collections.sort(sweets);
				StringBuilder sb = new StringBuilder();
				
				for (Integer j : sweets)
					sb.append(j + " ");
				
				System.out.print(sb);
				return;
			}
		}

		System.out.print("Oh sh*t");
	}
}
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 2
she won't accept the gift if there are no k consecutive candies of the same type

Для этого не обязательно сортировать весь список

Да и вместо Collections.frequency можно сразу при вводе считать каких сколько
Ответ написан
Комментировать
@distrik
Programador
Может быть так будет быстрее?
LinkedList<Integer> sweets = new LinkedList<>();
    StringBuilder sb = new StringBuilder();
    AtomicBoolean hasMinAmount = new AtomicBoolean(false);
    sweets.stream()
            .collect(Collectors.toMap(Integer::intValue, integer -> 1, Math::addExact))
            .forEach((candyName, amount) -> {
              if (amount >= min) {
                hasMinAmount.set(true);
              }
              for (int i = 0; i < amount; i++) {
                sb.append(candyName + " ");
              }
            });
    if (hasMinAmount.get()) {
      System.out.print(sb);
    } else {
      System.out.println("Oh sh*t");
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы