У меня все работает, но при попытке залить на сервер пишет, что программа не компилируется на сервере.

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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

/* Алгоритмы-числа
Число 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) {
        Arrays.stream(getNumbers(Integer.MAX_VALUE)).forEach(System.out::println);
    }

    public static int[] getNumbers(int n) {
        List<Integer> list2 = Collections.synchronizedList(new ArrayList<>());
        long start = System.currentTimeMillis();
        long memoryInitial = Runtime.getRuntime().totalMemory();

        Thread t = new Thread(() -> {
            IntStream.range(1, n)
                    .filter(value -> Runtime.getRuntime().totalMemory() - memoryInitial < 52428800)
                    .forEach(value -> {
                        ArrayList<Integer> digits = new ArrayList<>();
                        int temp = value;
                        while (true) {
                            if (temp > 0) {
                                digits.add(temp % 10);
                                temp /= 10;
                            } else
                                break;
                        }
                        Collections.reverse(digits);
                        int i = digits.stream()
                                .mapToInt(digit -> (int) Math.pow(digit, digits.size()))
                                .sum();
                        if (value == i)
                            list2.add(value);
                    });
        });

        t.setDaemon(true);
        t.start();

        while (System.currentTimeMillis() - start < 10000) {
            System.out.println("Memory: " + (Runtime.getRuntime().totalMemory() - memoryInitial));
            if (Runtime.getRuntime().totalMemory() - memoryInitial > 52428800)
                break;
            try {
                TimeUnit.MILLISECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        return list2.stream().mapToInt(e -> e).toArray();
    }
}

задан 14 Окт '16, 08:46

sva605's gravatar image

sva605
1076
одобрено: 32%

закрыто 13 Сен, 13:31

AndyRad's gravatar image

AndyRad
13.1k29

Вопрос был закрыт по следующей причине: "Problem is not reproducible or outdated" AndyRad 13 Сен, 13:31


Почему программа не компилируется вам не подскажу, но ваш цикл в конце:

работает 10 секунд. По условию задачи он должен работать не более 10 секунд, т.е. можете убрать его

Ну и если по алгоритму: за 3 секунды у меня начали только 7-значные числа перебираться. Я еще дома проверю, но можно и лучшего результата добиться. Ну и вывод используемой памяти тоже не нужен.

ссылка

опубликован 14 Окт '16, 09:30

IamAfli's gravatar image

IamAfli
6828
одобрено: 48%

изменено 14 Окт '16, 09:37

Лимит на 50 МБ отрабатывает быстрее

(14 Окт '16, 09:39) sva605

А у вас же получается, что он всегда отрабатывает 10 секунд, или я что то не понял?

(14 Окт '16, 09:36) IamAfli

Ну так он и прерывается на 10 секундах

(14 Окт '16, 09:31) sva605

Хм, администрация ресурса, а я правильно понимаю, что сервер JavaRush до сих пор не имеет ни малейшего понятия о том, что такое Java8???

ссылка

опубликован 14 Окт '16, 15:51

sva605's gravatar image

sva605
1076
одобрено: 32%

изменено 14 Окт '16, 15:57

Следить за вопросом

По Email:

После авторизации вы сможете подписаться на любые обновления здесь

Основы Markdown

  • *italic* or _italic_
  • **bold** or __bold__
  • ссылка:[текст](http://url.com/ "заголовок")
  • изображение?![alt текст](/path/img.jpg "заголовок")
  • нумерованный список: 1. Foo 2. Bar
  • Для того чтобы добавить разрыв строки просто добавьте два пробела.
  • основные HTML тэги, также поддерживаются

Тэги:

×764
×246
×177

Задан: 14 Окт '16, 08:46

Просмотров: 696 раз

Отредактирован: 13 Сен, 13:31