2015-11-04 2 views
0

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

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

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

Чтобы распечатать число, Я использую для цикла, как это:

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

Но если x является 100000 долго INT число, оно занимает около 4-5sec печатать на консоли, которая не является желательным.

Мое мнение:

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

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

+0

Какое практическое применение имеет это? Зачем вам нужно быстрее? –

+0

@ AndyTurner Я решаю вызов онлайн-судье, который вызывает тайм-аут, если время выполнения> 4сек –

+0

как насчет [BitSet] (http://docs.oracle.com/javase/7/docs/api/java/util /BitSet.html) вместо простого 'int'? – SomeJavaGuy

ответ

4

Если вы считаете, что число 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); 
1

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

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

Я также думаю, что вы должны посмотреть на Why is printing "B" dramatically slower than printing "#"?, который может пролить некоторый интересный свет на вашу проблему.

0

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

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

+1

В любом случае число 'System.out.print' является проблемой, а не числом циклов. – Keppil

Смежные вопросы