ВАРИАНТ, КОТОРЫЙ Я СПИСАЛ:

package com.javarush.test.level20.lesson10.bonus01;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Алгоритмы-числа
Число S состоит из M чисел, например, S=370 и M(количество цифр)=3
Реализовать логику метода getNumbers, который должен среди натуральных чисел меньше N (long)
находить все числа, удовлетворяющие следующему критерию:
число S равно сумме его цифр, возведенных в M степень
getNumbers должен возвращать все такие числа в порядке возрастания

Пример искомого числа:
370 = 3*3*3 + 7*7*7 + 0*0*0
8208 = 8*8*8*8 + 2*2*2*2 + 0*0*0*0 + 8*8*8*8

На выполнение дается 10 секунд и 50 МБ памяти.
*/
public class Solution {
    public static int[] getNumbers(int N) {
        int[] result = null;
        List<Integer> list = new ArrayList<>();
        for (int n = 1; n < N; n++) {
            int sum = 0, temp, r;
            int q = 0;
            temp = n;
            int length = (int) (Math.log10(n) + 1);
            while (temp != 0) {
                for (int i = 0; i < length; i++) {
                    int prod = 1;
                    r = temp % 10;
                    for (int j = 0; j < length; j++) {
                        prod = prod * r;
                    }
                    sum = sum + prod;
                    temp = temp / 10;
                }
            }
            if (n == sum) {
                list.add(n);
            }
        }
        result = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            result[i] = list.get(i);
        }
        System.out.println(Arrays.toString(result));
        return result;
    }

    public static void main(String args[]) {
        long memoryStart = Runtime.getRuntime().freeMemory();
        Long t0 = System.currentTimeMillis();
        int[] result = getNumbers(10000000);
        long memoryEnd = Runtime.getRuntime().maxMemory();
        long memoTaken = memoryStart - memoryEnd;
        System.out.println(memoTaken);
        Long t1 = System.currentTimeMillis();
        System.out.println("Time need to create the arrray = " + (t1 - t0));
        System.out.println("Used Memory in JVM: " + (Runtime.getRuntime().maxMemory() - Runtime.getRuntime().freeMemory()));
    }
}

МОЙ ВАРИАНТ, СЛИШКОМ ДОЛГИЙ:

package com.javarush.test.level20.lesson10.bonus01;

import java.util.ArrayList;

/* Алгоритмы-числа
Число S состоит из M чисел, например, S=370 и M(количество цифр)=3
Реализовать логику метода getNumbers, который должен среди натуральных чисел меньше N (long)
находить все числа, удовлетворяющие следующему критерию:
число S равно сумме его цифр, возведенных в M степень
getNumbers должен возвращать все такие числа в порядке возрастания

Пример искомого числа:
370 = 3*3*3 + 7*7*7 + 0*0*0
8208 = 8*8*8*8 + 2*2*2*2 + 0*0*0*0 + 8*8*8*8

На выполнение дается 10 секунд и 50 МБ памяти.
*/
public class Solution {
    public static void main(String[] args) {
        int N = 10000000;
        long start = System.currentTimeMillis();
        int[] m = getNumbers(N);
        long finish = System.currentTimeMillis();
        for (int i : m) {
            System.out.println(i);
        }
        System.out.printf("Execution spend %d,%d sec & %d mb of memory.",
                ((finish - start)/1000), ((finish - start) % 1000), (Runtime.getRuntime().totalMemory()
                        - Runtime.getRuntime().freeMemory())/1024/1024);
    }

    public static int[] getNumbers(int N) {
        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Integer> listOfPow = new ArrayList<>();    //список степенных сумм чисел Армстронга
        for (int i = 0; i < N; i++) {
            if (i < 10) list.add(i);
            else {
                int sum = 0;
                int[] digits = new int[String.valueOf(i).length()];
                int x = 0;
                for (int j = i; j != 0; j /= 10) {
                    sum += j % 10;
                    digits[x++] = j % 10;
                }
                if (!listOfPow.contains(sum)) {
                    int summ = 0;
                    for (int digit : digits) {
                        summ += Math.pow((double) digit, (double) digits.length);
                    }
                    if (i == summ) {
                        list.add(i);
                        listOfPow.add(sum);
                    }
                }
            }
        }

        int[] result = new int[list.size()];
        for (int i = 0; i < result.length; i++) {
            result[i] = list.get(i);
        }
        return result;
    }
}