Loading...
MartinBG avatar MartinBG 4803 Точки

Java Advanced Exam - 22 Oct 2017 - коментари, решения...

Как ви се стори изпитът, колеги? :)

 

На мен задачите ми харесаха, защото изискваха повече мисъл и нямаше скрити условия и "подводни камъни" в Judge.

Последната задача доста ме измъчи - 4 часа употребих за нея и пак не ми стигнаха за повече от 60/100 blush

Първа задача ми хареса най-много, защото си искаше малко алгоритми за 100/100.

Втора и трета - нищо особено.

Ето решенията ми на първите 3 задачи за тези, които са имали проблеми с някоя от тях: линк

 

Тагове:
0
Module: Java Advanced
MartinBG avatar MartinBG 4803 Точки

Може ли някой от колегите със 100 точки от 4-та задача да я тества с тези входни данни  и да постне тук резултатите?

1.

\E\Q1%\E<([{\^-=$!|]})?*+.>\Q2%\Q\E
\E\Q%\E<([{\^-=$!|]})?*+.>\Q%\Q\E
Print

 

2.

\E\Q1%\E<([{\^-=$!|]})?*+.>\Q2%\Q\E
%
Print

 

3.

\E\Q1%\E<([{\^-=$!|]})?*+.>\Q2%\Q\E
%%%
Print

0
krasi1105 avatar krasi1105 380 Точки

И трите входа дават един и същ изход: E\Q\%2Q\>.+*?)}]|!$=-^\{[(<E\%1Q\E\

Ето и решението, простичко е

1
MartinBG avatar MartinBG 4803 Точки

Благодаря!

Оказа се, че проблемът в моето решение е в "сглабянето на стринга" (70/100):

               StringBuilder sb = new StringBuilder();
                int lastEndIndex = 0;
                while (matcher.find()) {
                    int startIndex = matcher.start();
                    sb.append(text.substring(lastEndIndex, startIndex));
                    sb.append(new StringBuilder(matcher.group()).reverse());
                    lastEndIndex = matcher.end();
                }
                sb.append(text.substring(lastEndIndex, text.length()));
                text = sb.toString();

Решението минава със 100/100, ако заменя горния код с:

                while (matcher.find()) {
                    text = text.replace(matcher.group(), new StringBuilder(matcher.group()).reverse().toString());
                }

 

Ето го и цялото ми решение: линк

Използвам малко по-различен подход за оформяне на регекса (без индивидуално искейпване на специалните символи и апендване символ по символ). Предполагам заради това моята версия е с около 30% по-бърза от твоята, но това в случая няма особено значение.

 

EDIT:

Този код също не успява да мине в Judge (60/100), но показва още един начин за подмяна на матчнати части от стринг:

                StringBuffer stringBuffer = new StringBuffer();
                while (matcher.find()) {
                    matcher.appendReplacement(stringBuffer, new StringBuilder(matcher.group()).reverse().toString());
                }
                matcher.appendTail(stringBuffer);
                text = stringBuffer.toString();

EDIT 2:

В документацията на appendReplacement метода пише, че той третира $ като специален символ. Това обяснява защо горното решение гърми на един от тестовете. За заобикаляне на проблема с краша, $ трябва да се искейпне:

                StringBuffer stringBuffer = new StringBuffer();
                while (matcher.find()) {
                    matcher.appendReplacement(stringBuffer, new StringBuilder(matcher.group().replace("$", "$\\")).reverse().toString());
                }
                matcher.appendTail(stringBuffer);
                text = stringBuffer.toString();

 

EDIT 3:

Още един метод, който работи аналогично на горния, но ползва Matcher.quoteReplacement, който се грижи за искейпването на $:

                StringBuffer stringBuffer = new StringBuffer();
                while (matcher.find()) {
                    matcher.appendReplacement(stringBuffer, Matcher.quoteReplacement(new StringBuilder(matcher.group()).reverse().toString()));
                }
                matcher.appendTail(stringBuffer);
                text = stringBuffer.toString();

 

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