Не проходит по 4 пункту.
Пишет: "В массиве возвращаемом методом getNumbers не хватает элементов или есть лишние.", но я думаю, я просто не укладываюсь по времени, точнее он не хочет вообще обсчитывать, если вводить Long.MAX_VALUE.
Может, есть ошибки в логике?
На меньших числах, вроде считает правильно.
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
Set<Long> set = new HashSet<>();
for (long i = 1; i < N; i++) {
if (isUniqueNumber(i)) {
long sumOfNUms = sum(i);
if (isArmstrongNumber(sumOfNUms)) {
set.add(sumOfNUms);
}
}
}
long[] result = new long[set.size()];
List<Long> list = new ArrayList<>(set);
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
if (list.get(i) < N) {
result[i] = list.get(i);
}
}
return result;
}
public static boolean isUniqueNumber(long n) {
long lastDigit = 0;
long currentDigit;
while (n > 0) {
currentDigit = n % 10;
if (lastDigit > currentDigit) {
return false;
}
lastDigit = currentDigit;
n /= 10;
}
return true;
}
public static boolean isArmstrongNumber(long n) {
if (sum(n) == n) {
return true;
}
return false;
}
public static long sum(long n) {
int degree = String.valueOf(n).length();
long sum = 0;
int number = (int) (n % 10);
while (n >= 1) {
sum += array[number][degree];
n /= 10;
number = (int) (n % 10);
}
return sum;
}
public static long[][] array = new long[10][19];
static {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
array[i][j] = (long) Math.pow(i, j);
}
}
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(0)));
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(Integer.MAX_VALUE)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}