Очень понравилась задача)
думаю второй день над упрощением, решение писала сама - конечно, всегда можно взять и скопипастить готовое с Гитхаба, но очень надеюсь, что можно упростить свое
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
long[] result = null;
int numberOfDigits=1;
long[][]pows = new long[10][19];
for (int i = 0; i < 10; i++) {
for (int j = 1; j < pows[i].length; j++) {
pows[i][j] = (long) Math.pow(i, j);
}
}
ArrayList<Integer> current;
Map<ArrayList<Integer>,Long> sets = new HashMap<>();
ArrayList<Long> armsNumbers = new ArrayList<>();
for (long i = 1; i <N ; i++) {
current = calcSet(i);
if(!sets.containsKey(current)){// проверка уникальности набора чисел
numberOfDigits=(int)(Math.log10(i)+1);
long pow=0;
for (Integer integer : current) {
pow+=pows[integer][numberOfDigits];
}
sets.put(current,pow);
}
if(sets.get(current)==i){
armsNumbers.add(i);
}
}
result = new long[armsNumbers.size()];
for (int j=0;j<armsNumbers.size();j++) {
result[j]=armsNumbers.get(j);
}
return result;
}
public static ArrayList<Integer> calcSet(long i){ // составляем набор цифр каждого числа
ArrayList<Integer> digits = new ArrayList<>();
int temp;
while (i>0){
temp=(int)i%10;
digits.add(temp);
i=i/10;
}
Collections.sort(digits);
return digits;
}
public static void main(String[] args) {
long start = System.currentTimeMillis();
long[] arr=getNumbers(1000000);
long finish = System.currentTimeMillis();
System.out.println("memory: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (1024 * 1024) + " mb");
System.out.println("time " + (finish-start) + "sec");
for (long l : arr) {
System.out.print(l+" ");
}
}
}