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. Степень строки

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

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

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

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

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

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

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

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

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

Тесты

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

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

Решение

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

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

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

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

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

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

Запоминаем эту подстроку 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 в противоположном случае.

e-olymp 2034. WERTYU

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

Обычная ошибка при наборе состоит в том, что вы помещаете ваши руки на клавиатуру на один ряд правее верной позиции. Тогда «Q» печатается как «W«, «J» печатается как «K» и т.д. Ваша задача состоит в расшифровке сообщения, напечатанного таким образом.

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

Входные данные состоят из нескольких строк текста. Каждая строка может содержать цифры, пробелы, прописные буквы (кроме Q, A, Z ) и знаки препинания, показанные выше [кроме обратной кавычки (`)]. Клавиши, обозначенные словами [Tab, BackSp, Control и т.д.], не представлены во входных данных.

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

Вы должны заменить каждую букву и знак пунктуации тем, который находится непосредственно слева от него на клавиатуре QWERTY, изображенной выше. Пробелы во входных данных должны повторяться в выходных.

Тесты:

Входные данные Выходные данные
O S, GOMR YPFSU/ I AM FINE TODAY.
,u vpp; vpfr MY COOL CODE
VPFR RBRTUEJRTR. RBRTUFSU CODE EVERYWHERE, EVERYDAY

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

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

Для решения поставленной задачи необходимо задать строку, в которой будем хранить все символы с условия, которые необходимо выводить. Так как не указано количество строк входных данных, то будем принимать до конца входного потока.

Для каждой строки будем просматривать все символы, и для каждого из них будем использовать следующий алгоритм:

  1. Если данный символ пробел – то выведем его на экран.
  2. Иначе, с помощью функции Indexof() найдем номер вхождения данного символа в проверочном массиве y, и выведем предыдущий элемент из этого массива.
  3. Повторяем пункты 1, 2 до тех пор, пока не дойдем до конца строки x. После этого перейдем на новую строку.

Условие задачи на сайте e-olymp.com можно найти здесь.

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

Layout change

Условие

Часто происходит так, что пользователи, вводя текст на некотором языке, забывают переключить раскладку клавиатуры на этот язык. Если при этом пользователь не владеет методом слепой печати, он может обнаружить свою ошибку, уже набрав немалое количество текста. Чтобы избавить пользователя от необходимости перепечатывать весь текст в нужной раскладке, можно написать программу, которая сделает это за него.

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

На вход подается некоторая строка текста, который нужно изменить.

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

Вывести исходную строку текста, «перепечатанную» в другой раскладке.

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

Тесты :

Ввод Вывод
Руддщб цщкдв! Hello, world!
Ghbdtn? vbh! Привет, мир!
Шэь пдфв ещ ыуу нщг I’m glad to see you
Rfr ltkf& Как дела?
ащк (ште ш = 0ж ш Б тж ш++) for (int i = 0; i < n; i++)

Код на Java:

Алгоритм:

В памяти хранятся строки соответствия. Каждому символу одной строки соответствует символ другой строки на той же позиции, но соответствующий символ — из другой раскладки.

Вводим строку, которую требуется заменить. Измененный вариант будет записываться в другой, временной строке.

Далее проходим по всей введенной строке. Если некоторый текущий символ можно заменить, записываем измененный символ. Если нет, то записываем исходный.

А в конце переписываем исходную строку и выводим ее:

Ссылки:

Рабочий код для тестирования на Ideone.com: Ideone.com

e-olymp 494 Гласные

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

К гласным буквам в латинском алфавите относятся буквы A, E, I, O, U и Y. Остальные буквы считаются согласными. Напишите программу, считающую количество гласных букв в тексте.

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

Во входном файле содержатся одна строка текста, состоящая только из заглавных латинских букв и пробелов. Длина строки не превышает 100 символов.

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

В выходной файл вывести одно целое число – количество гласных во входном тексте.

Входные данные Выходные данные
BE HAAAAPPY ! 6
ZACHTITE PLEASE 6
BBC KLMN 0

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

Алгоритм решения:
Строка вводится пользователем согласно условию. Перебираем по каждой букве введенной строки или не равны они с соответствующей индексу гласной букве. Если равны, прибавляем счетчику 1. Далее в, любом случае, ищем по оставшимся гласным буквам.

Условие задачи на e-olymp.com
Проверка решения на e-olymp.com
Рабочий код на ideone.com