Полный ступор, понимаю что числа находит те, так как пробывал на вход маленькие значения, а вот для лонг макс вэлью, ищет бесконечно долго.
package com.javarush.task.task20.task2025;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public static long[] getNumbers(long N) {
ArrayList<Long>longs = new ArrayList<>(); //пустой список
for (long i = 1; i <N ; i++) {
String s = Long.toString(i);
String[] textArray = s.split("");
long[] result = new long[textArray.length];
for (int j = 0; j < result.length; j++) {
result[ j] = Long.parseLong(textArray[ j]); //массив из цифр текущего счетчика
}
List<Long> list = new ArrayList<>();
for (long l : result) {
list.add((long) Math.pow(l, result.length)); //все элемнты массива в степень и в новый лист
}
long sum = 0;
for (Long aLong : list) {
sum += aLong; //суммирую все элементы листа
}
if (sum == i ) {
longs.add(sum); //если равны добавляю в массив
}
}
long[]newest = new long[longs.size()];
int index =0; //новый масив требуемый задачей
for (Long entry : longs){
newest[index++]= entry;
}
return newest;
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(Long.MAX_VALUE)));
long b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(8208)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
//
// Long t0 = System.currentTimeMillis();
// //int n = 21474672;
// long n = Long.MAX_VALUE;
// long[] numbers = 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 (long number : numbers) {
// System.out.print(number + ", ");
// }
// System.out.println();
}
}