Когда строка содержит только один символ, вы все равно запускаете String s1 = s.substring(0,2);
, который попытается получить доступ ко второму символу, и вы получите исключение вне диапазона.
Вы можете написать свой код как:
String s = "o";
String s1 = s;
if (s.length() > 2) {
s1 = s.substring(0,2);
}
System.out.println(s1);
Таким образом, вы можете создать подстроку из s
, только если она содержит более 2 символов.
Если Вы изменитесь от целого числа до длинного, то оно даст Вам достаточно комнаты для решения проблемы. Здесь был код, что я раньше отвечал на этого:
for(int i=1;i<=1000000;i+=2)
{
steps=1;
int n=i;
long current=i;
while(current!=1)
{
if(current%2==0)
{
current=current/2;
}else{
current=(current*3)+1;
}
steps++;
}
if(steps>best)
{
best=steps;
answer=n;
}
}
Скот, вызывающий его, занимает приблизительно 9 секунд для выполнения
Ваша проблема не с размером стека (Вы уже - memoizing значения), но с
Подсказка:
public static int seqCount(int n)
{
if(hm.get(n) != null) {
return hm.get(n);
}
if (n < 1) {
// this should never happen, right? ;)
} ...
...
Это должно, надо надеяться, быть достаточно :)
P.S. Вы столкнетесь с потребностью в BigNums в большом количестве эйлеровых проблем проекта...
При подсчете размера последовательности Collatz для чисел до 1 000 000, необходимо пересмотреть Целый тип использования. Я предлагаю использовать BigInteger или возможный длинное.
Это должно облегчить проблемы, с которыми встречаются, но быть предупреждено, что у можно все еще закончиться пространство "кучи" в зависимости от JVM.
Примечание стороны (поскольку кажется, что Вам на самом деле не нужна оптимизация последнего вызова для этой проблемы): оптимизация последнего вызова не доступна в Java, и насколько я услышал, это даже не поддерживается байт-кодом JVM. Это означает, что любая глубокая рекурсия не возможна, и необходимо осуществить рефакторинг ее для использования некоторой другой конструкции цикла.