Добрый день! Матрицу степеней использую, числа отсеиваю, строки не использую. Выполнение тестовое занимает: 1) для Integer.MAX_VALUE - 11603 ms 2) для 10000000000L - 53306 ms Валидатор ругается не на время исполнения (хоть оно и не фонтан), а говорит: "Проверь, что в методе getNumbers не возникает исключения, при любых входных данных." Подскажите, что можно улучшить?
public class Solution {

    private static long[][] tabExponention = new long[10][21];

    static {
        for (int i=1;i<10;i++)
            for (int j=1;j<21;j++)
                tabExponention[i][j] = (long) Math.pow((double) i, (double) j);
    }

    public static long[] getNumbers(long N) {
        ArrayList<Long> tmpRes = new ArrayList<>();

        if (N<1) return new long[0];

        for (long i = 1;i<N;i++)
            if (isNormalNumber(i))
                if (getExpSum(i) < N && getExpSum(i) == getExpSum(getExpSum(i)))
                    if (!tmpRes.contains(getExpSum(i)))
                        tmpRes.add(getExpSum(i));

        long[] result = new long[tmpRes.size()];
        for (int q = 0; q<tmpRes.size(); q++)
            result[q] = tmpRes.get(q);

        Arrays.sort(result);

        return result;
    }

    // вычисление степенной суммы
    private static long getExpSum(long num) {
        int len = (int) Math.log10(num)+1;
        long sum = 0;
        while (num > 0) {
            sum += tabExponention[(int) (num % 10)][len];
            num /= 10;
        }
        return sum;
    }

    // отсекаем числа не по возрастанию цифр и с непоследними нулями
    private static boolean isNormalNumber(long num)
    {
        int prev = 0;
        while (num > 0) {
            int digit = (int) (num % 10);
            if( (digit > prev || digit == 0) && prev != 0 ) return false;
            num /= 10;
            prev = digit;
        }
        return true;
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
//        long [] res = getNumbers(370);
//        long [] res = getNumbers(10000000000L);
        long [] res = getNumbers(Integer.MAX_VALUE);
        long finish = System.currentTimeMillis();
        System.out.printf(Arrays.toString(res));
        System.out.println("\nTime consumed: " + (finish - start) + " ms");
        System.out.println("memory: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + " mb");
    }
}