В IntelliJ IDEA 2023.2.1 на компьютере выдает результат (добавлен метод для вычисления Long.MAX_VALUE)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407]
memory 384
time = 0
[1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834]
memory 384
time = 0
[1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, 1741725, 4210818, 9800817, 9926315, 24678050, 24678051, 88593477, 146511208, 472335975, 534494836, 912985153, 4679307774, 32164049650, 32164049651, 40028394225, 42678290603, 44708635679, 49388550606, 82693916578, 94204591914, 28116440335967, 4338281769391370, 4338281769391371, 21897142587612075, 35641594208964132, 35875699062250035, 1517841543307505039, 3289582984443187032, 4498128791164624869, 4929273885928088826]
memory 566
time = 1
но на сервере валидацию не проходит.
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
private static long[][] pows;
private static long[] powsOfTen;
public static long[] getNumbers(long N) {
if (N <= 1) {
return new long[0];
}
int count = getCount(N);
getPows();
getPowsOfTen(count);
long[] result;
Set<Long> setOfNumbers = new TreeSet<>();
long i = 1;
do {
long sum = getSum(i);
long tempI = i;
if (sum > 0 && tempI != sum) {
tempI = sum;
sum = getSum(tempI);
}
if (sum > 0 && tempI == sum) {
setOfNumbers.add(tempI);
}
} while ((i = getNextNumber(i)) < N && i > 0);
result = new long[setOfNumbers.size()];
int j = 0;
for (Long l : setOfNumbers) {
result[j] = l;
j++;
}
return result;
}
/**
* Метод вычисляет следующее уникальное число, где каждая цифра не менее предыдущей
*
* @param i
* @return the next unique number
*/
private static long getNextNumber(long i) {
if (i % 10 == 0) {
int count = 0;
long temp = i;
while (temp % 10 == 0) {
temp /= 10;
count++;
}
long c = temp % 10;
return (i + (c * powsOfTen[count - 1]));
} else {
return ++i;
}
}
/**
* Метод вычисляет двумерный массив степеней от 0 до 20 чисел от 0 до 10.
*/
private static void getPows() {
/* 0 1 2 3
0[1][0][0][0]
1[1][1][1][1]
2[1][2][4][6]
3[1][3][9][27]
4[1][4][16][64]
5[1][5][25][125]*/
pows = new long[10][20];
for (int i = 0; i < 10; i++) {
long p = 1;
for (int j = 0; j < pows[i].length; j++) {
pows[i][j] = p;
p *= i;
}
}
}
/**
* Метод составляет массив степеней числа 10
*
* @param count
*/
private static void getPowsOfTen(int count) {
powsOfTen = new long[count - 1];
powsOfTen[0] = 1;
for (int i = 1; i < powsOfTen.length; i++) {
powsOfTen[i] = powsOfTen[i - 1] * 10;
}
}
/**
* Метод вычисляет степенную сумму цифр в числе
*
* @param number
* @return the sum of the powers of digits in a number
*/
private static long getSum(long number) {
int count = getCount(number);
long sum = 0;
while (number != 0) {
sum += pows[(int) (number % 10)][count];
number /= 10;
}
return sum;
}
/**
* Метод считает количество цифр в переданном числе
*
* @param number
* @return number of digits in Params
*/
private static int getCount(long number) {
long dev = 10;
for (int i = 1; i < 19; i++) {
if (dev > number)
return i;
else
dev *= 10;
}
return 19;
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(1000)));
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(1000000)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}