Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
6 / 6 / 3
Регистрация: 14.11.2016
Сообщений: 53

Оценить качество кода -- решение учебное задачи для начинающих

09.01.2017, 23:55. Показов 1812. Ответов 5

Студворк — интернет-сервис помощи студентам
Решил задачу для начинающих на acmp по Java.

Мой результат -- задача принята, но время выполнения -- 0,404 секунды, память -- 5,3 Мб.
Лучший результат другого ученика -- время выполнения 0,149 секунды, память -- 1556 Кб. Как понятно, мой результат далёк от оптимального.

Суть задачи:
в текстовом файле вводится шесть целых чисел через пробел, например
5 1 7 8 9 10
Мы должны разделить строку на две и получить: 5 1 7 и вторую 8 9 10
Затем отсортировать каждую строку по уменьшению чисел, то есть получить
7 5 1 и 10 9 8
Затем нужно перемножить и сложить: 7 * 10 + 5 *9 + 1*8=70 +45 + 8 =123
Цифра 123 является ответом. Нужно записать её в файл output.txt
Сама же начальная строка находится в файле input.txt

Вот моё решение:

Как можно сделать код лучше в плане избавления от говно-кода и как можно ускорить программу, чтобы приблизиться к лучшему результату в 0,149 секунды?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.util.*;
import java.io.*;
 
public class Main{ //имя класса должно быть Main
    public static void main(String[] argv) throws IOException{
        new Main().run();
    }
    PrintWriter pw;
    Scanner sc;
    public void run() throws IOException{
        sc = new Scanner(new File("input.txt"));
 
        int[] a,b;
 
        a = new int[3];
        b = new int[3];
 
        for (int i=0;i<3;i++){
            a[i] =new Integer(sc.nextInt());
        }
 
        for (int i=0;i<3;i++){
            b[i] = new Integer(sc.nextInt());
        }
 
        int res1[] = get_max(3, a);
        int res2[] = get_max(3, b);
 
        pw = new PrintWriter(new File("output.txt"));
        pw.print(res1[0]*res2[0]+res1[1]*res2[1]+res1[2]*res2[2]);
        pw.close();
    }
   
    //На входе получаем число n=3, и массив a, например, 5 1 7.
   //На выходе мы хотим получить массив по убыванию, например, 7 5 1
    public static int[] get_max(int n, int[] a){
       for (int i=0; i<2;i++){
            if (a[i]<a[i+1]){
                int results[] = change(a[i], a[i+1]);
                a[i] = results[0];
                a[i+1] = results[1];
            }
        }
 
        if (a[0]<a[1]) {
            int results[] = change(a[0], a[1]);
            a[0] = results[0];
            a[1] = results[1];
        }
 
        return new int[] {a[0], a[1], a[2]};
    }
 
    //меняем числа a и b
    public static int[] change(int a, int b){
        int temp;
        temp = a;
        a = b;
        b = temp;
 
        return new int[] {a,b};
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2017, 23:55
Ответы с готовыми решениями:

Оценить качество кода -- решение учебное задачи для начинающих
Я где-то читал, что программисту важно хорошо разбираться в О больших. Например, можно решить задачу за O(n*n), но ещё лучше -- решить её...

Оценить качество кода (читабельность и эффективность)
Написал javascript библиотеку для уведомлений (notifications). github repo https://github.com/madtaras/madtaras-toast Главный файл...

Оценить качество кода написанного фреймворка
Прошу оценить то что пока написал: https://github.com/DeadMoras/tc-framework Роутеры - до этого свои были, вроде работали, но там...

5
 Аватар для fn12gl34
1 / 1 / 0
Регистрация: 19.05.2015
Сообщений: 59
09.01.2017, 23:58
Скажу по поводу памяти-используешь слишком много массивов. Попробуй использовать меньше, перезаписывая информацию в них по мере нужды
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
10.01.2017, 09:42
Цитата Сообщение от vjg2017 Посмотреть сообщение
new Integer
Зачем?
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
10.01.2017, 18:57
Как-то сложно все.
Java
1
2
3
4
5
6
7
8
9
10
String first = Files.lines(PATH).findFirst().get();
        String[] split = first.trim().split("\\s+");
        String[] left = Arrays.copyOfRange(split, 0, 3);
        String[] right = Arrays.copyOfRange(split, 3, 6);
        Arrays.sort(left, Collections.reverseOrder());
        Arrays.sort(right, Collections.reverseOrder());
        int sum = IntStream.range(0,3).map(i->{
            return Integer.parseInt(left[i])*Integer.parseInt(right[i]);
        }).sum();
        Files.write(PATH, String.valueOf(sum).getBytes());
1
6 / 6 / 3
Регистрация: 14.11.2016
Сообщений: 53
10.01.2017, 22:34  [ТС]
xoraxax, ваша программа не даёт верного ответа.

Давайте прогоним строку:
1 2 30 9 5 10

Нам нужно разбить строку на две:
1 2 30 и 9 5 10
Затем отсортировать, в результате чего получим:
30 2 1 и 10 9 5
А затем умножить и сложить, 30*10+2*9+1*5=323 -- правильный ответ.

Именно такой ответ даст программа, если загнуть мой код.

Я загнал ваш код и получил ответ: 290

Вот ваш код. Скорее всего, ошибка происходит здесь:
Arrays.sort(left, Collections.reverseOrder());
Arrays.sort(right, Collections.reverseOrder());
Ваша программа сортирует left правильно (на выходе получается 30 2 1), а вот right почему-то она оставляет без изменений (на выходе получается не 10 9 5, как должно быть, а 9 5 10, то есть всё остаётся без изменений).
В итоге умножение происходит так: 30*9+2*5+1*10=290 -- получается из-за того, что не происходит сортировки на right правильного ответа.


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.IntStream;
 
public class Main{ //имя класса должно быть Main
    public static void main(String[] argv) throws IOException{
        new Main().run();
    }
    public void run() throws IOException {
 
        Path path = Paths.get("","input.txt");
 
 
        String first = Files.lines(path).findFirst().get();
        String[] split  = first.trim().split("\\s+");
        String[] left = Arrays.copyOfRange(split, 0, 3);
        String[] right = Arrays.copyOfRange(split, 3, 6);
        Arrays.sort(left, Collections.reverseOrder());
        Arrays.sort(right, Collections.reverseOrder());
        //for (int i=0;i<3;i++){
        //    System.out.print(left[i]+" ");
        //}
        //System.out.println();
        //for (int i=0;i<3;i++){
        //    System.out.print(right[i]+" ");
        //}
        //System.out.println();
 
        int sum = IntStream.range(0,3).map(i->{
            return Integer.parseInt(left[i])*Integer.parseInt(right[i]);
        }).sum();
 
        Path path2 = Paths.get("","output.txt");
        Files.write(path2, String.valueOf(sum).getBytes());
 
    }
 
}
Добавлено через 14 минут
korvin_

Да, действительно вы правы, я опустил new Integer и всё работает. Спасибо за улучшение кода.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
10.01.2017, 22:46
Лучший ответ Сообщение было отмечено vjg2017 как решение

Решение

че-то тупанул, строки сортируются - поэтому порядок другой
Java
1
2
3
4
5
6
7
8
String[] split = first.trim().split("\\s+");
        List<Integer> collect = Arrays.stream(split).map(s -> Integer.parseInt(s)).collect(Collectors.toList());
        System.out.println(collect);
        collect.subList(0,3).sort(Collections.reverseOrder());
        collect.subList(3,6).sort(Collections.reverseOrder());
        System.out.println(collect);
        int sum = IntStream.range(0,3).map(i->collect.get(i)*collect.get(i+3)).sum();
        System.out.println(sum);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2017, 22:46
Помогаю со студенческими работами здесь

Где можно оценить качество своего кода?
Здравствуйте! Как оценить качество своего кода?

Калькулятор для начинающих, прошу оценить
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int menu (); int sum (); int razn (); int vozved (); int delen...

Как оценить качество PR?
Подскажите, как оценить качество PR сайта? Увидеть что он обоснованный, а не искусственный.

Java для начинающих , прошу оценить код
я только учусь писать на java и очень прошу вас , пользователей данного портала имеющих опыт , оценить код по шифрованию/дешифрованию шифра...

Как оценить качество сайта?
Не ругайтесь, я тута новенький и о СЕО-оптимизации знаю очень мало, но точно знаю, что она вроде есть. Поэтому умных вопросов задавать не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru