Добрый день!
Матрицу степеней использую, числа отсеиваю, строки не использую.
Выполнение тестовое занимает:
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");
}
}
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
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(371);
// long [] res = getNumbers(10000000000L);
// long [] res = getNumbers(Long.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");
}
}
код