2017-01-15 3 views
-2
public class cowcode { 

public static void main(String[] args) { 

    long index = 1000000 
    String line = HELLO 

    boolean found = false; 
    if (index <= line.length()) 
     found = true; 

    while (!found) { 
     line += buildString(line); 
     if (index <= line.length()) 
      found = true; 
    } 

    if (found) 
     System.out.println("" + charAt(line, index-1)); 
} 

public static String buildString(String str){ 
    String temp = "" + str.charAt(str.length()-1); 

    for (int i = 0; i < str.length()-1; i ++){ 
     temp += str.charAt(i); 
    } 
    return temp; 
} 

public static String charAt(String line, long index){ 
    for (int i = 0; i < line.length(); i ++){ 
     if (i == index) 
      return line.charAt(i) + ""; 
    } 
    return ""; 
} 
} 

Привет! Код выше работает отлично. Однако единственной проблемой является время выполнения.Повышение эффективности программы

Целью этой программы является создание строки из «HELLO» (которая в конечном итоге будет иметь длину индекса по меньшей мере размера). Это делается путем поворота строки вправо («HELLO» -> «HELLOOHELL» и конкатенации исходной строки и повернутой версии вместе. Этот процесс не останавливается до тех пор, пока индекс, который ищет программа, не найден в Строка. (поэтому в данном примере строка будет «HELLOOHELLLHELLOOHEL» после прохождения через петлю дважды).

ли вы, ребята, видите все, что может быть устранено/укороченной для улучшения выполнения?

ответ

1

Вам нужно вычислить индекс без фактического построения строки. Правая половина составной строки вращается, а левая - нет. Если у вас есть индекс в левой половине строки, вы можете просто выбросить правую половину. Следовательно, вы упростили ситуацию. Если у вас есть индекс в правой половине, вы можете преобразовать его в индекс в левой половине. Вам просто нужно отменить поворот строки в правой половине. Таким образом, вы поворачиваете индекс, оставленный одним символом. Теперь вы можете выровнять половину строки и у вас есть индекс в левой половине строки. Эта ситуация уже описана выше. Итак, вы сокращаете строку и начинаете с начала. В конце концов вы получите строку, которая не состоит. Это оригинальная строка. Теперь вы можете обращаться к символам напрямую с индексом, так как теперь он находится в диапазоне строки.

index = 1000000 - 1; 
line = "HELLO"; 
int len = line.length(); 
long len2 = len; 
while (len2 <= index) { 
    len2 *= 2; 
} 
while (len2 > len) { 
    long lenhalf = len2/2; 
    if (index >= lenhalf) { 
     index -= lenhalf; 
     index -= 1; 
     if (index < 0) { 
      index += lenhalf; 
     } 
    } 
    len2 = lenhalf; 
} 

System.out.println(line.charAt((int)index)); 
+0

Это потрясающе! Спасибо! – yj2000

2

что я предполагаю, убить вас есть все Струнные сцеплений вы делаете в buildString вы можете сократить его до этого:.

public static String buildString(String str){ 
    return str.charAt(str.length()-1) + str.substring(0, str.length()-1); 
} 
+0

Вы правы! Время выполнения было уменьшено на много! Есть ли еще что-нибудь? – yj2000

+0

Программа должна иметь возможность обрабатывать индекс с границами индекса <= 10^18. Даже при этом программа не может справиться с этим большим числом. – yj2000

+0

В этом случае вам нужно искать алгоритм, который не связан с конкатенацией строки до ее вращения. Никакая система не сможет обрабатывать строку 1-exabyte. (Но это выходит за рамки этого вопроса.) –

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