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

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

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

Author24 — интернет-сервис помощи студентам
Решил задачу для начинающих на 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2017, 23:55
Ответы с готовыми решениями:

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

Оценить качество кода (читабельность и эффективность)
Написал javascript библиотеку для уведомлений (notifications). github repo ...

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

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

5
1 / 1 / 0
Регистрация: 19.05.2015
Сообщений: 59
09.01.2017, 23:58 2
Скажу по поводу памяти-используешь слишком много массивов. Попробуй использовать меньше, перезаписывая информацию в них по мере нужды
1
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
10.01.2017, 09:42 3
Цитата Сообщение от vjg2017 Посмотреть сообщение
new Integer
Зачем?
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
10.01.2017, 18:57 4
Как-то сложно все.
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  [ТС] 5
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 6
Лучший ответ Сообщение было отмечено 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
10.01.2017, 22:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2017, 22:46
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru