Омовение Рамы

  • 10
  • Недоступна
Когда-то жил и правил легендарный древнеиндийский царь Рама. И, вероятно, была та, которая его родила. Не факт, что она мыла его самостоятельно (царица всё-таки), но да простят нам знатоки эту невинную историческую фантазию. Напишем программу, которая заменит текст «мама мыла раму» на «Мама Мыла Раму».
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (345)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Maksim8 уровень, Москва
позавчера, 17:58
Не читал обсуждения к задаче и в итоге решил через замороченный метод: 1. Вводим текст с клавиатуры; 2. Создаем TreeMap (в нем есть поддержка higher value), через цикл for пишем в TreeMap строку (ключ i, значение - charAt(i);
TreeMap<Integer, Character> strings = new TreeMap<>();
for (int i = 0; i < string.length(); i++) {
    char value = string.charAt(i);
    strings.put(i,value);
  }
3. Пишем итератор для TreeMap, внутри прописываем .higherEntry;
for (Map.Entry<Integer, Character> pair : strings.entrySet()) {
    Map.Entry<Integer, Character> next = strings.higherEntry(pair.getKey());
3.1 Если getKey()==0 -> заменяем в Treemap value этого ключа через .toUpperCase;
if (pair.getKey() == 0)
    strings.replace(pair.getKey(),Character.toUpperCase(pair.getValue()));
3.2 Если getValue() == ' ' (одинарные кавычки для проверки совпадения с char пробелом) -> заменяем в Treemap value следующего ключа через .toUpperCase;
if (pair.getValue() == ' ') {
    strings.replace(next.getKey(),Character.toUpperCase(next.getValue()));
3.3 Выводим на экран value TreeMap;
System.out.print(pair.getValue());
Очевидно не самое изящное и общее решение, но для меня показалось логичным записать все в мапу, чтобы точно каждый символ введенной строки попадал в последующий ключ и не возникало каких-то проблем. А TreeMap выбрал за счет наличия возможности использовать higher key. После решения много интересного нашел в обсуждении)))
Kubik_1310 уровень, Москва
2 декабря, 15:42
7 (СЕМЬ!!!) попыток бл*** как меня эти пробелы достали ((( в итоге сразу после ввода строки - trim а разделение строки через регулярное выражение учитывая несколько пробелов и в конце тоже trim после сборки строки назад
leksa13 уровень, Москва
20 ноября, 10:35
Учитываем, что валидатор будет проверять: 1. на наличие лишних пробелов в начале и конце строки 2. наличие лишних пробелов между словами. Спойлеры: Как сделать слово с заглавной буквы
word.substring(0, 1).toUpperCase() + word.substring(1);
word.substring(0, 1) - берет первый символ из слова toUpperCase() - делает его заглавным word.substring(1) - добавляет к заглавной букве остальную часть слова
Алсыгаев Евгений15 уровень, Hanoi
20 ноября, 03:54
Множество пробелов: string.split("\\s{1,}") Удаление пробелов перед строкой и после строки: string = string.trim(); Печать: System.out.print(word.substring(0, 1).toUpperCase()+word.substring(1)+ " ");
Vonorim23 уровень
18 ноября, 18:16
Когда первый раз увидел эту задачу на своем 8 уровне - офигел и ничего не понял, были какие-то подходы. Прорешал немало подобных задач на codewars - теперь вообще проще простого.
Алексей Кулиш15 уровень, Челябинск
14 ноября, 06:27
вначале думал как половина комментаторов, что мы нужных методов не проходили, немного погуглив и перечитав пройденный материал сделал вывод, что решается все без "непройденных методов", хоть и чуть более чем в 4 строки. 0) опционально "трим" к строке, работает и без этого(валидацию не проверял в таком формате) 1) массив символов из строки (туЧарЭррэй) 3) проверка условия совпадения текущего символа массива с пробелом в цикле и приведение следующего за ним символа к верхнему регистру 3.1) если был трим - первый символ через условие в верхний регистр 4) вывод в консоль с приведением массива к строке никаких поисков символов, никаких танцев с гуглом
Андрей11 уровень, Львов
13 ноября, 22:23
3 строчки кода с помощью цикла фор, но так обидно что надо было цикл сделать с 0 а не с 1 - валидатор не пропускал из-за того что я не учел что первая буква может быть пробелом. И я вообще подумал что надо было с мамой малы раму делать проверку - попался дважды.
Bender14 уровень, Калуга
8 ноября, 21:44
очень долго ломал голову как решить . В общем для тех кто хочет все же сам решить а не искать готовый ответ вот подсказка . для начала переводим строку в char[] с помощью метода toCharArray(), затем ищем Индексы первых букв каждого слова ( за счет перебора массива char) здесь уже надо подумать как можно перебирая массив выделить индексы первых букв слов( подсказка , перед каждым новым словом есть пробел) , да и еще , индексы мы ищем для того чтобы записать их в массив , здесь тоже каждый для себя решит как ему удобно , я использовал ArrayList, так как он очень гибкий и не надо парится на счет размеров. Теперь когда у нас есть индексы первых букв нужно их заменить в нашем char[] на буквы Заглавные я использовал Character.toUpperCase(), либо как то по своему , главное что бы они стали заглавными. ну а теперь остается только присвоить наш массив из чаров к исходной строке . ( String string = new String(char[]) )вот и все . надеюсь это будет полезно.
NOL15 уровень
13 ноября, 12:39
можно и без ArrayList, просто при первом переборе делаем букву массива следующую за пробелом [i+1] заглавной методом Character.toUpperCase()
Смол10 уровень
19 ноября, 17:39
не понял только как самую первую букву включить в эту проверку. или по умолчанию её заглавной делать? как-то коряво
Евгений9 уровень, Минск
четверг, 21:24
Никак не могу состыковать ArrayList и массив символов. Пробовал так:
ArrayList<Character> chars = new ArrayList<>(string.toCharArray());
И так:
ArrayList<Character> chars = new ArrayList<>();
Collections.addAll(chars, string.toCharArray());
Не понимаю, в чем ошибка. Подскажите, пожалуйста.
GigaMax12 уровень, Пермь
6 ноября, 16:59
Для решения использовал StringTokenizer и substring. Решение чуть позже выложу. Интересны ваши варианты и комментарии)
GigaMax12 уровень, Пермь
6 ноября, 17:07
как и обещал, мое решение
GigaMax12 уровень, Пермь
6 ноября, 17:37
Саш9 уровень, Москва
13 ноября, 10:09
Спасибо!
Дмитрий16 уровень, Москва
19 ноября, 12:02
Я использовал StringBuffer и Character.toUpperCase(). Получилось неплохо и чуть покороче.
Алексей Захарченко19 уровень, Иркутск
4 ноября, 05:41
мне помогли split и substring