Эффективно печатать длинную последовательность

Я должен напечатать число, которое представляет собой огромную последовательность из 5 и 3 (до 100 000 целых чисел). Вместо того, чтобы хранить его в массиве, я просто сохранил их количество в noOfThrees и noOfFives.

Для простоты назовем это число x. ,

Поскольку мне приходится печатать наибольшее число в последовательности, x будет изначально 5, а затем с 3 (у меня есть рабочая логика для печати, если нет 5 или нет 3)

Чтобы напечатать номер, я использую цикл for следующим образом:

for(int i=0; i<noOfFives; i++) 
    System.out.print(5);
for(int i=0; i<noOfThrees; i++)
    System.out.print(3);

Но если x является 100 000 длинным номером int, требуется около 4-5 секунд для его распечатки на консоли, что нежелательно.

Мой прием:

  • Если noOfFives четный, тогда напечатайте 55 в цикле for, который увеличивает производительность на x2 и увеличивает цикл на два, иначе
  • Используйте тот же цикл, что и выше. То же самое касается noOfThrees.

Но проблема здесь в том, что если это странно, оно снова закончит печать с шагом 1. Как эффективно напечатать эту последовательность?

0
04 нояб. '15 в 7:14
источник поделиться
3 ответа

Если вы считаете, что количество вызовов print является проблемой, вы можете уменьшить ее до 1: поместить правильное число 3s и 5s в массив символов, а затем распечатать:

char[] cs = new char[noOfFives + noOfThrees];
Arrays.fill(cs, 0, noOfFives, '5');
Arrays.fill(cs, noOfFives, cs.length, '3');
System.out.print(cs);
+4
04 нояб. '15 в 7:27
источник

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

Однако я думаю, что это значительно увеличит вашу производительность, чтобы сначала построить строку в памяти, а затем распечатать ее.

Я также думаю, что вы должны посмотреть, почему печать "B" значительно медленнее, чем печать "#"? которые могут пролить некоторый интересный свет на вашу проблему.

+1
04 нояб. '15 в 7:22
источник
другие ответы

Связанные вопросы


Похожие вопросы

Я думаю, что вы можете использовать циклическую развертку, это может сократить время выполнения цикла.
например:

    for(int i=0; i<noOfFives; i+=5) {
        System.out.print(5);
        System.out.print(5);
        System.out.print(5);
        System.out.print(5);
        System.out.print(5);
    }

Для получения дополнительной информации см. Https://en.wikipedia.org/wiki/Loop_unrolling

0
04 нояб. '15 в 7:23
источник

Посмотрите другие вопросы по меткам или Задайте вопрос