Рекомендации ментора гласит: Проверь, что в методе getNumbers не возникает исключения, при любых входных данных.
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
long[] result = null;
TreeSet<Long> numbers = new TreeSet<>();
int digitcnt = 0;
long nn = N;
while(nn != 0){
digitcnt ++;
nn = nn / 10;
}
//final int SIZE = 2 + (int) Math.log10(N);
long[][] powLst = new long[10][digitcnt+1];
int[] lst = new int[digitcnt+1];
label:
for (long i = 1; i < N; i++) {
long x = i;
int lenCount = 0;
int current;
int last = 9;
while (x != 0) {
current = (int) (x % 10);
if ((current != 0 && last != 0) && last < current)
continue label;
last = current;
lst[lenCount] = current;
x = x / 10;
lenCount++;
}
long summa1 = 0;
for (int j = 0; j < lenCount; j++) {
if (powLst[lst[j]][lenCount] == 0) {
long a1 = lst[j];
if (a1 != 0 && a1 != 1) {
long a2 = lst[j];
for (int jj = 1; jj < lenCount; jj++)
a1 *= a2;
}
powLst[lst[j]][lenCount] = a1;
}
summa1 += powLst[lst[j]][lenCount];
}
if(summa1 == i){
numbers.add(summa1);
}
else if(summa1 < N) {
long xx = summa1;
lenCount = 0;
while (xx != 0) {
lst[lenCount] = (int) (xx % 10);
lenCount++;
xx = xx / 10;
}
long summa2 = 0;
for (int j = 0; j < lenCount; j++) {
if (powLst[lst[j]][lenCount] == 0) {
long a1 = lst[j];
if (a1 != 0 && a1 != 1) {
long a2 = lst[j];
for (int jj = 1; jj < lenCount; jj++)
a1 *= a2;
}
powLst[lst[j]][lenCount] = a1;
}
summa2 += powLst[lst[j]][lenCount];
}
//Добавляем результат
if (summa1 == summa2) {
numbers.add(summa1);
}
}
}
result = new long[numbers.size()];
int count = 0;
for (Long l : numbers) {
result[count] = l;
count++;
}
return result;
}
public static void main(String[] args){
Long t0 = System.currentTimeMillis();
long n = 10000000;
long[] lst = getNumbers(n);
Long t1 = System.currentTimeMillis();
System.out.println("time: " + (t1 - t0) / 1000d + " sec");
System.out.println("memory: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + " mb");
for (int i = 0; i < lst.length; i++) {
System.out.print(lst[i] + ", ");
}
System.out.println();
}
}