Loading...
zdravkostov avatar zdravkostov 4 Точки

5. Matrix Shuffling

Условие:

https://softuni.bg/trainings/resources/officedocument/59902/exercise-java-advanced-may-2021/3345

Дава ми 20/100, като 2та примерни теста са ми верни. Направих няколко дебъга и програмата ми работи както трябва. Бих бил благодарен ако ми откриете проблема. Ето го кода:

package JavaAdvanced;

import java.util.Scanner;

public class MatrixShuffling {
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        int N = scan.nextInt();
        int M = scan.nextInt();
        String[][] arr = new String[N][M];

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                arr[i][j] = scan.next();
            }
        }

        String[] line;
        int a;
        int b;
        int x;
        int y;

        while (true) {
            line = scan.nextLine().split(" ");
            if (line[0].equals("END")) {
                break;
            }
            if (line.length == 5) {
                if (line[0].equals("swap")) {
                    a = Integer.parseInt(line[1]);
                    b = Integer.parseInt(line[2]);
                    x = Integer.parseInt(line[3]);
                    y = Integer.parseInt(line[4]);
                    if (a >= N || b >= M || x >= N || y >= M) {
                        System.out.println("Invalid input!");
                    } else {
                        String c = arr[a][b];
                        arr[a][b] = arr[x][y];
                        arr[x][y] = c;
                        for (int i = 0; i < N; i++) {
                            for (int j = 0; j < M; j++) {
                                System.out.print(arr[i][j] + " ");
                            }
                            System.out.println();
                        }
                    }
                }
            } else if (!line[0].equals("")) {
                System.out.println("Invalid input!");
            }
        }
    }
}
Тагове:
0
Java Advanced
icowwww avatar icowwww 2813 Точки

Здравей,

Преработих четенето на големината на матрицата и пълненето ѝ да е с nextLine и след това split по \s- space, tab or newline. 

Даде 60 точки с 2 неуспешни теста с грешка за време, затова се наложи да сменя четенето да е с BufferedReader. След тази промяна даде 100/100. 

Ето го променения код: https://pastebin.com/J8KKpwgE

 

0
26/05/2021 22:14:49
zdravkostov avatar zdravkostov 4 Точки

Ползвам scan.next() при такива случаи с матрици - тъй като не ми се занимава да правя със сплит функцията.

Ако разбирате Java, бихте ли обяснили защо точно не става със scan.next() и как работи scan.next()? И ако може да обясните BufferedReader, защото него не съм го ползвал никъде?

0
27/05/2021 16:38:41
icowwww avatar icowwww 2813 Точки

Здравей,

С next и nextInt прочиташ следващ стринг или int(общо казано токен) разделени от whitespace.

Така четеш по един токен от конзолата независимо дали е на същия или на следващия ред. Когато прочетеш един път поставя мислено cursor-а на 1 с един char напред след края на прочетения токен.

Когато използваш next(), но няма елемент от текущия ред, който да вземе автоматично ще се опита да прочете такъв от следващия ред.

Тоест ако пуснеш програмата и въведеш:

2

1 2 3

4 5 6

Когато се опита да прочете втория токен:

int N = scan.nextInt();
int M = scan.nextInt();

Ще го прочете от първия токен от втория ред(1) и ще ти направи матрицата [2][1];

По този начин при попълване на числа в матрицата, ако на някой от редовете имаш по-малко елементи ще попълва с едно число напред матрицата, което ще изглежда така:

инпут:

2 3
1 2 3
4 5
swap 1 1 1 1
swap 1 1 1 1

END

output:

1 2 3 
4 5 swap 

Затова аз лично не бих използвал тези методи, ако не слагам лично данните в конзолата.

Относно BufferedReader за проблема с Time limit:

Processing Speed Scanner is bit slower as it need to parse data as well. BufferReader is faster than Scanner as it only reads a character stream.

 

 

2
27/05/2021 21:42:31
zdravkostov avatar zdravkostov 4 Точки

Много Ви благодаря!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.