e-olymp 440. Подделка чека

Задача

Один из способов мошенничества, разработанных О. Бендером, заключался в следующем. Он вырезал полоску бумаги, содержащую несколько цифр из суммы чека (можно вырезать и крайние цифры), разрезал ее на две части, переставлял эти две части местами и аккуратно подклеивал обратно. Напишите программу, определяющую максимальное число, которое может быть получено в результате указанной манипуляции.

Входные данные

Во входном файле в первой строке содержится одно целое положительное число не более чем из $100$ цифр.

Выходные данные

В выходной файл вывести одно число – максимальное число, которое можно получить в результате указанной манипуляции, или исходное число, если увеличить число невозможно.

Тесты

Входные данные Выходные данные
$123321$ $332121$
$7888778888878888788878878777887$ $8888878888788878887778878777887$
$1091$ $9100$
$26364$ $64263$
$98765$ $98765$

Код программы

Решение задачи

Пусть заданы два числа: $a = \overline{a_1a_2 \ldots a_k},\ b = \overline{b_1b_2 \ldots b_k}$. Тогда $a > b \Leftrightarrow \exists i: \ \forall j < i \ a_j = b_j \ \wedge \ a_i > b_i$. Отсюда получаем необходимое условие получения максимального числа при перестановке в записи числа $a$ групп цифр $\overline{a_ia_{i+1} \ldots a_l}$ и $\overline{a_ja_{j+1} \ldots a_m} \ l<j$ местами: $i = \min_{1 < s < k} s: \ \exists t>s: \ a_t \gt a_s$. Если такое $i$ существует, то делаем перебор по всем возможным перестановкам, таким что первая группа чисел начинается с индекса $i$ и таким образом находим максимально возможное число. В противном случае данное число уже является максимальным.

Ссылки

Условие задачи на e-olymp
Решение на e-olymp
Код решения на Ideone. String

e-olymp 3020. Семь решений в процентах

Задача

Семь решений в процентах

Универсальные идентификаторы ресурсов (или URI) являются строками, например, такие как http://icpc.baylor.edu/icpc/, MAILTO: foo@bar.org, ftp://127.0.0.1/pub/linux, или даже просто readme.txt, что, как правило, используется для идентификации ресурсов в Интернете или на локальном компьютере. Некоторые символы зарезервированы в URI, и если зарезервированный символ является частью идентификатора, то он должен быть процент-закодирован, заменив его знаком процента, за которым следуют две шестнадцатеричные цифры, представляющие ASCII код символа. Таблица семи зарезервированные символы и их кодировка приведена ниже. Ваша задача написать программу, которая может выполнять процент-кодирование заданной строки символов.

Символ Кодировка
» » (space) %20
«!» (exclamation point) %21
«$»(dollar sign) %24
«%» (percent sign) %25
«(» (left parenthesis) %28
«)» (right parenthesis) %29
«*» (asterisk) %2a

Входные данные

Входные данные состоят из одной или нескольких строк, каждая из 1-79 символов в отдельной строке, а затем строки, содержащей только «#», что свидетельствует об окончании ввода. Символ «#» используется только как маркер окончания входных данных и не содержится в других местах во входных данных. Строка может содержать пробелы, но не в начале или в конце строки, и никогда не содержит двух или более последовательных пробелов.

Выходные данные

Для каждой строки, полученной на входе, заменить каждое вхождение зарезервированного символа в таблице, приведённой выше, на его процент-кодирование, точно так, как это показано в примере, и вывести результирующую строку в отдельной строке. Ещё раз отметим, что процент-кодирование для символа «*» «%2a» (со строчной «а»), а не «%2A» (с прописной буквой «A»).

Тесты

Входные данные Выходные данные
Happy Joy Joy!
http://icpc.baylor.edu/icpc/
plain_vanilla
(**)
?
the 7% solution
#
Happy%20Joy%20Joy%21
http://icpc.baylor.edu/icpc/
plain_vanilla
%28%2a%2a%29
?
the%207%25%20solution

Код программы

Решение

Создаем цикл в котором с помощью метода replace начиная с «%» (т.к. он будет использоваться в последующих кодировках) заменяем символы на их кодировку в ASCII и печатаем измененную строку. В начале каждого цикла проверяем является ли строка «#».

Ссылки

Ideone
решение e-olymp

АА14

Условие задачи

В заданной строке удалить первый символ ‘.’, который найдется в строке.

Входные данные

Строка с точками либо без них.

Выходные данные

Строка без первой точки.

Код

Описание решения

Объявляем переменную str и присваиваем ей значение, при помощи метода String.indexOf() находим индекс первого вхождения символа ‘.’ . Разделяем строку на две части: первая до точки, вторая — после. Выводим на экран сумму данных строк.

Работу программы можно увидеть на сайте ideone.

e-olymp 2165. Лишние пробелы

Задача

Дана строка. Напишите программу, которая удалит из этой строки все лишние пробелы.
Пробел является лишним, если выполняется хотя бы 1 из условий:

  • он находится в самом начале строки, до самого первого слова;
  • он находится в конце строки, после самого последнего слова;
  • несколько пробелов расположены между двумя словами (проще говоря, если слова разделены более чем одним пробелом, тогда все пробелы кроме одного — лишние).

Входные данные

Дана строка s. Строка содержит только латинские буквы и пробелы.

Выходные данные

Строка без лишних пробелов.

Тесты

Входные данные Выходные данные
1 «Alexandr      Sergeevich   Pushkin» «Alexandr Sergeevich Pushkin»
2 «JohnSnow» «JohnSnow»
3 » Mr    Charlie       Chaplin » «Mr Charlie Chaplin»
4 «Mechnikov    University» «Mechnikov University»
5 «Daenerys          Targaryen» «Daenerys Targaryen»

Код

Ссылка на ideone.
Ссылка на e-olymp.

Решение

Вводим строку s, которая содержит латинские буквы и пробелы. Используем метод replaceAll()  для удаления лишних пробелов. Чтоб не удалить последний оставшийся пробел используем regex " +", " " . «Прочитать» его по-русски можно так: " +"  — выделить 1 или больше пробелов до символа, не являющимся пробелом и " "  — заменить выделенную последовательность на 1 пробел. Проверяем символы на концах строки на наличие пробела. Перезаписываем подстроку без пробелов в строку s.

Затем выводим полученную строку.

e-olymp 1078. Степень строки

Постановка задачи

Обозначим через [latex]a\cdot b[/latex] конкатенацию строк [latex]a[/latex] и [latex]b[/latex].

Например, если [latex]a=[/latex] «abc» и [latex]b=[/latex] «def», то [latex]a\cdot b=[/latex] «abcdef».
Если считать конкатенацию строк умножением, то можно определить операцию возведения в степень следующим образом:

[latex]a^{0}=[/latex] «» (пустая строка)
[latex]a^{n+1}=a\cdot a^{n}[/latex]

По заданной строке [latex]s[/latex] необходимо найти наибольшее значение [latex]n[/latex], для которого [latex]s=a^{n}[/latex] для некоторой строки [latex]a[/latex].

Входные данные:

Каждый тест состоит из одной строки [latex]s[/latex], содержащей печатные (отображаемые) символы. Строка [latex]s[/latex] содержит не менее одного и не более миллиона символов.

Выходные данные:

Для каждой входной строки [latex]s[/latex] вывести в отдельной строке наибольшее значение [latex]n[/latex], для которого [latex]s=a^{n}[/latex] для некоторой строки [latex]a[/latex].

Тесты

Входные данные Выходные данные
1 abcabcabc 3
2 aaaaaaaaaa 10
3 ollollo 1
4 pjpjpjpj 4

Посмотреть работу программы на примере приведенных выше тестов можно на сайте ideone.

Решение

Описание решения

Получая строку str из потока ввода, вызываем функцию static public int StringPow(final String str) и передаем полученную строку в качестве входного параметра. Функция StringPow возвращает значение типа int — наибольшую степень строки, которую программа и передаст в поток вывода в качестве выходных данных.

Минимальной степенью строки может быть число [latex]1[/latex] — в том случае, если в заданной строке [latex]s[/latex] нет повторяющихся подстрок. Максимальной же степенью строки может быть количество символов, из которых строка состоит — в том случае, если строка состоит из одного повторяющегося символа. В этом случае этот символ и будет считаться повторяющейся подстрокой.

Получив в качестве входного аргумента строку str, предположим внутри тела функции StringPow, что степень данной строки равна [latex]1[/latex] ( int pow = 1;) на тот случай, если бо́льшую степень найти не удастся.

Так как нужно найти число повторений подстроки минимального размера в строке str, будем проверять все подстроки размером от [latex]1[/latex] символа до size/2, где size — длина строки. Строка не может состоять из повторяющейся подстроки размером меньше [latex]1[/latex] или больше половины строки. Отсюда цикл for (int i=1; i<=size/2; i++).

Сразу будем отсеивать подстроки, из повторений которых строка не может состоять из-за несоответствия количества символов строки и подстроки ( if (size % i != 0) continue;). К примеру, строка длиной [latex]8[/latex] символов не может состоять из повторений подстроки длиной [latex]3[/latex] символа.

Запоминаем эту подстроку String sub1 = new String(str.substring(0, i));, а затем будем сравнивать с каждой следующей подстрокой такого же размера String sub2 = new String(str.substring(j, j+i)); во внутреннем цикле, предполагая перед этим, что мы нашли нужную нам подстроку ( boolean found = true;); если сверяемые подстроки различаются ( if (!sub1.equals(sub2))) — значит рассматриваемая подстрока sub1 искомой подстрокой не является. Прерываем действие внутреннего цикла и переходим к следующей подстроке, длиной на 1 символ больше. Если же строка полностью состоит из подстроки sub1 находим степень строки — число повторений подстроки в строке, иначе говоря, делим размер строки на размер подстроки ( pow = (size/i);).

Посмотреть решение задания можно на сайте e-olymp.

e-olymp 912. Количество предложений

Условие задачи

Задача взята с сайта e-olymp

Определить количество предложений в заданном фрагменте текста на английском языке, количество символов в котором не превышает 250. Гарантируется, что в тексте отсутствуют тире, дефисы, цифры и числа.

Тесты

Входные данные: строка — фрагмент текста

Выходные данные: количество предложений в заданной строке

Входные данные Выходные данные
1 Hello World! 1
2 Don’t fall in love with programming languages: they hurt 0
3 Is this a string!? This string… 2
4 Winter. Winter? Winter! 3

Код

Код доступен на ideone

Результаты проверки доступны на e-olymp

Пояснение

Для хранения заданной строки будем использовать переменную  string типа  String, которая будет проинициализирована значением из стандартного потока ввода, а для хранения результата — переменную sentenceCount  типа int , которую проинициализируем числом 0. Переменные объявляются в начале программы.

Каждое предложение может заканчиваться точкой, восклицательным знаком или вопросительным знаком, или же комбинацией этих символов (например, многоточием). Для анализа строки воспользуемся средствами для работы с регулярными выражениями. Для хранения шаблона, по которому будет производиться поиск, используется класс  Pattern, переменной типа которого присваивается шаблон, получаемый из строки-регулярного выражения с помощью статического метода этого класса Pattern.compile() . В данном случае переменная  pattern инициализируется шаблоном, получаемым из регулярного выражения [.!?]+, которое соответствует условиям задачи

Для того, чтобы произвести сравнение строки с шаблоном, используется класс  Matcher, переменной типа которого нужно присвоить возвращаямое значение метода  match() класса Pattern , который принимает строку. Для подсчета количества предложений воспользуемся методом find() класса  Matcher, который проверяет, есть ли далее в данной строке подстрока, соответствующая заданному шаблону, и возвращает  true , если подстрока найдена, или  false , если нет. Подсчет количества предложений производится путем вызова данного метода в цикле до тих пор, пока он не вернет  false — результатом подсчета будет количество итераций цикла.

Результат работы программы — вывод значения переменной sentenceCount.

 

 

АА14

Задача

В заданной строке удалить первый символ ‘ . ‘, который найдется в строке.

Тесты

Входная строка Строка на выходе
 1 22.11.11 2211.11
 2 java.mazurok.com javamazurok.com
 3 Suspect The dot was not found.

Решение

Проверить работу кода можно в облаке по ссылке — Ideone.

Пояснения

Для редактирования строки  mainString , используем класс обертку  StringBuilder. Находим индекс первого вхождения точки в строке и записываем его в переменную  dotIndex , после чего выполняем проверку, нашла ли функция  indexOf()  точку в строке. Если нет, выводим соответствующее сообщение. Иначе же выполняем удаление символа из строки по индексу с помощью функции  deleteCharAt() и выводим результат в консоль.

e-olymp 2163. Сообразим на троих!

Задача

К Василию приехали два его друга с отличной новостью: они выиграли в лотерею n рублей. Поскольку лотерейный билет был получен на сдачу во время общей закупки в магазине, то его принадлежность определить не удалось. Было решено разделить выигрыш поровну. Василий хотел бы узнать, можно ли честно разделить выигрыш.

Входные данные

Одно натуральное число n, количество знаков которого не превышает 255.

Выходные данные

Вывести «YES», если входное число делится на 3, и «NO» если не делится.

Исходный код

Тесты

Входные данные Выходные данные
1 33 YES
2 0 YES
3 1 NO
4 1234567890987654321 YES
5 12345678901 NO

Решение

Вводим строку, конвертируем её в int, далее проверяем — если сумма цифр делится по модулю на 3, то выводим «YES», если нет — то «NO».

Ссылка на Ideone

http://ideone.com/oGvfOO

e-olymp 2166: Анаграммы

Задача

Слово называется анаграммой другого слова, если оно может быть получено перестановкой его букв.

Входные данные

Два слова заданы в отдельных строках. Слова состоят из строчных латинских букв и цифр. Длины слов не превышают 255.

Выходные данные

Следует вывести «YES«, если введенные слова являются анаграммами друг друга и «NO» если нет.

Решение

В задаче требуется определить являются ли два введенных слова анаграммами.
Основная проблема состоит в том, что буквы находятся в словах на различных позициях и это мешает нам просто сравнить строки. Поэтому упорядочим символы в строке по алфавиту с помощью метода Arrays.sort, который вызываем в функции sortString, которая вернет нам новую отсортированную строку.
Теперь мы можем выполнить сравнение строк с помощью функции equals(), которая вернет нам true только в том случае, если строки идентичны. В таком случае и выводим «YES», а в противном случае «NO».

Код

На Ideone.

Тест

Входные данные Выходные данные
sharm

marsh

YES
ananas

nnaass

NO
tommarvoloriddle
iamlordvoldemort
YES

Ссылка на задачу на e-olimp и на ее решение.

e-olymp 2162. Палиндром

Палиндром — это строка, которая одинаково читается слева направо и справа налево. Составьте программу, которая проверяет, является ли заданный текст палиндромом. Не забудьте, что при чтении пробел никак не произносится.

Входные данные

Дана строка S (|S| ≤ 255), состоящая из строчных латинских букв и пробелов. Под |S| подразумевается длина строки.

Выходные данные

Требуется вывести «YES«, если текст является палиндромом, «NO» если не является.

Тесты

Входные данные Выходные данные
1 palindrom NO
2 a roza upala na lapu azora YES
3 my gym YES
4 character NO

Решение на Ideone
Решение на e-olymp

Алгоритм решения

В данной строке удаляем все пробелы, сравниваем полученную строку с новой строкой, которая содержит все символы данной строки, но в обратном порядке, возвращаем true если строки равны и false в противоположном случае.