Программа, правда, исполняется 40 секунд при памяти 20 мб. Результат вроле ок. Помогите плз советом. Спасибо
package com.javarush.task.task20.task2025;
public class test {
//------------------------------solution with missing numbers
/*public class Solution {
private static List<Long> list = new ArrayList<>();
private static final int maxNum = 9;
private static final int maxPower = 19;
private static long MAX_VAL;
private static boolean OVER;
private static final long MAX_ARM = 4679307774l;
private static HashMap<Integer, Long[]> powerNum = new HashMap<>();
private static byte[] sort(byte[] array) {
//byte[] result = null;
List<Byte> list = new ArrayList<>();
for (int i = 0; i < array.length; i++)
list.add(array[i]);
Collections.sort(list);
byte[] result = new byte[list.size()];
for (int i = 0; i < list.size(); i++)
result[i] = list.get(i);
return result;
}
private static void initPowerNum() {
Long[] vals = null;
for (int i = 1; i < maxPower + 1; i++) { // power
vals = new Long[maxNum + 1];
for (int j = 0; j < maxNum + 1; j++) { // number 0 - 9
vals[j] = (long) Math.pow(j, i);
}
powerNum.put(i, vals);
}
}
public static long[] getNumbers(long N) {
long[] result = null;
try {
Long[] powerArray = null;
long num = -1;
long max = N;
List<Long> listRes = new ArrayList<>();
List<Long> test = new ArrayList<>();
while (num < max) {
num++;
// num = 8208;
if (num >= 10 && num % 10 == 1) {
long temp = num;
int co = 0;
do {
temp = temp / 10;
co++;
} while (temp % 10 == 0);
long dig = temp % 10;
for (int i = 0; i < co; i++)
temp = temp * 10;
long val = dig;
for (int i = co; i > 1; i--)
val = val * 10 + dig;
num = temp + val;
if (num < 0) break;
}
test.add(num);
//num = 2222222222l;
int power = String.valueOf(num).length();
powerArray = powerNum.get(power);
try {
long temp = num;
long sum = 0;
do {
int symb = (int) (temp % 10);
sum += powerArray[symb];
temp = temp / 10;
}
while (temp > 0);
//if (sum == 407) System.out.println(sum + " " + num);
byte[] byteArrSum = String.valueOf(sum).getBytes();
byte[] byteArrNum = String.valueOf(num).getBytes();
if (byteArrSum.length == byteArrNum.length) {
byteArrSum = sort(byteArrSum);
byteArrNum = sort(byteArrNum);
boolean equal = true;
for (int i = 0; i < byteArrSum.length; i++) {
if (byteArrSum[i] != byteArrNum[i]) {
equal = false;
break;
}
}
if (equal) {
listRes.add(sum);
}
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(num);
break;
}
}
Collections.sort(listRes);
result = new long[listRes.size()];
for (int i = 0; i < listRes.size(); i++) {
result[i] = listRes.get(i);
}
return result;
} catch (Exception e) {
return result;
}
}
public static void main(String[] args) {
Date startDate = new Date();
initPowerNum();
long[] result = getNumbers(10000);
Date endDate = new Date();
System.out.println("time=" + (endDate.getTime() - startDate.getTime()));
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
}
}
*/
/*public class Solution {
public static void main(String[] args) {
int num = 0;
int max = 1000;
while (num < max) {
num++;
if (num % 10 == 0) {
int temp = num;
int co = 0;
while (temp % 10 == 0) {
temp = temp / 10;
co ++;
}
int dig = temp % 10;
for (int i = co; i > 0; i--) {
num = num + dig * (int)Math.pow(10, i - 1);
}
}
System.out.print(num + " ");
}
//System.out.println();
}
}*/
// ------------------ file
/*public class Solution {
public static long[] getNumbers(long N) {
long[] result = null;
try {
BufferedReader reader = new BufferedReader(new FileReader("c:\\temp\\java\\armstrong.txt"));
List<Long> list = new ArrayList<>();
String s;
while ((s = reader.readLine()) != null) {
s = s.trim().split(",")[0];
if (Long.parseLong(s) < N) list.add(Long.parseLong(s));
}
result = new long[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
} catch (Exception e) {
return result;
}
}
public static void main(String[] args) throws IOException {
//long[] result = getNumbers(Long.MAX_VALUE);
long[] result = getNumbers(Long.MAX_VALUE);
/*for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + " ");
}
}
}*/
// ------------------ recurse
/*public class Solution {
private static List<Long> list = new ArrayList<>();
private static final int maxNum = 9;
private static final int maxPower = 19;
private static long MAX_VAL;
private static boolean OVER;
private static final long MAX_ARM = 4679307774l;
private static HashMap<Integer, Long[]> powerNum = new HashMap<>();
private static void initPowerNum() {
Long[] vals = null;
for (int i = 1; i < maxPower + 1; i++) { // power
vals = new Long[maxNum + 1];
for (int j = 0; j < maxNum + 1; j++) { // number 0 - 9
vals[j] = (long) Math.pow(j, i);
//System.out.print(vals[j] + " ");
}
//System.out.println();
powerNum.put(i, vals);
}
}
public static void comb(long num, long sum, Long array[], int power, int level) {
if (!OVER) {
int startIndex = 0;
if (level == 1) startIndex = 1;
for (int i = startIndex; i < array.length; i++) {
if (level < power) { // go to one more level
comb(num * 10 + i, sum + array[i], array, power, level + 1);
} else {
if (num * 10 + i > MAX_VAL) {
OVER = true;
return;
}
if (num * 10 + i == sum + array[i]) {
list.add(num * 10 + i);
}
}
}
}
}
public static long[] getNumbers(long N) {
long[] result = null;
try {
MAX_VAL = N;
if (MAX_VAL > MAX_ARM) MAX_VAL = MAX_ARM;
//System.out.println(N);
int lengthN = String.valueOf(N).length();
for (int power = 1; power <= lengthN; power++) {
// sum all combinations of power for numbers 0 - 9
Long array[] = powerNum.get(power);
comb(0, 0, array, power, 1);
}
int i = 0;
while (i < list.size()) {
if (list.get(i) >= N)
list.remove(i);
else i++;
}
if (list.size() == 0) return result;
result = new long[list.size()];
for (i = 0; i < list.size(); i++)
result[i] = list.get(i);
return result;
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) {
initPowerNum();
//getNumbers(Long.MAX_VALUE);
//System.out.println("num=" + Long.MAX_VALUE / 3000000000l);
Date startTime = new Date();
long[] result = getNumbers(1000l);
Date endTime = new Date();
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
System.out.println("time=" + (endTime.getTime() - startTime.getTime()));
/*System.out.println();
for (int i = 0; i < list.size() ; i++) {
System.out.print(list.get(i) + " ");
}
}
}*/
}