Loading...
nikiii07 avatar nikiii07 31 Точки

Въпрос относно задача #2 от Java Fundamentals Retake - 26 October 2015

Здравейте, извинявам се предварително ако съм объркал мястото на темата!

Реших да се пробвам с тази инстанция на изпита и имам проблем с втората задача, judge-ът ми дава 90/100 точки, а не знам каква е причината. Това е сорс кодът. Тъй като решението ми е малко странно, да обясня:

  • Методът getKey връща String, като удвоява върнатото от getChar
  • Методът getChar връща съответният char от ASCII таблицата, като проверява дали числото е в рейндж[1..52] и ако не е, го свежда до този рейндж чрез формули, до които стигнах с калкулатора (заради тях ми се налага и да проверявам дали делението е четно/нечетно), но всички тестове, които направих за този метод работеха
  • Останалото е просто да прочета входа и след това с регекс да взема всеки мач и да го принт-на (не чета новите редове, всичко е singleline)

 

Тагове:
2
Java Advanced 27/10/2015 02:35:39
Innos avatar Innos 419 Точки
Best Answer

Ето къде е проблема колега:

int division = key / 26;
return getChar(division % 2 == 0 ? key % 26: key % (26 * (division - 1)));

нека вземем като пример key = 104; тогава division = 104/26 = 4;
тогава от следващият ред 4(division) % 2 ще е равно на 0 и 104 % 26 пак е равно на 0 и ще извикаш методът си пак със key = 0, но методът ти не може да работи с key = 0 => 

return (char) (key + 96);

0 + 96 = 96;
(char) 96 = '(единична кавичка);

Просто много объркващ ти е станал методът за намиране на key-a, предлагам ти да го опростиш с нещо от вида:

key = (key - 1) % 52;
if( key < 26)
{
return (char)('a' + key);
}
else
{
key = key % 26;
return (char)('A' + key);
}

Логиката е че независимо какъв е ключът, като извадиш 1 (понеже ключът е между [1 - int.MaxValue]) и приложиш модулно деление на 52 ще получиш стойност между 0-51 (0-25 -> a-z) (26-51 -> A-Z). Ако е между 0-25 връщаш 'а' + [0-25] -> a-z, ако е между 26-51 прилагаш пак модулно деление на 26 и получаваш пак стойност между 0-25 само че този път връщаш капитализираните char-ове 'А' + [0-25] -> A-Z.

1
28/10/2015 18:48:51
nikiii07 avatar nikiii07 31 Точки

Благодаря ти, наистина там беше проблемът.

0
mgulubov avatar mgulubov 73 Точки

Другия вариант е да го направиш каруцарската и да вадиш от ключа, докато не го докараш до стойност между 1 и 25, като на всяко вадене си прeвърташ едно флагче, което накрая ще ти каже дали ключа трябва да е capital или lower-case. Аз лично, първо пробвах така и след като сработи и не изгърмя за време, изобщо не се занимавах с модулни деления :P.

int flag = 1;

while (key > 26) {
    key -= 26;
    if (flag == 1) {
        flag = 2;
    } else {
        flag = 1;
    }

}

char c;
if (flag == 1) {
    c = (char) (96 + key);
} else {
    c = (char) (64 + key);
}

Това нещо дава общо време за изпълнение 0.073 s.

3
27/10/2015 04:28:39
enevlogiev avatar enevlogiev 1168 Точки

Имаше тест с ключ 2 милиарда... Май трябваше да е 200 милиарда : )

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