Составить цепочку слов

  • 24
  • Недоступна
В методе main считай с консоли имя файла, который содержит слова, разделенные пробелом. В методе getLine используя StringBuilder расставь все слова в таком порядке, чтобы последняя буква данного слова совпадала с первой буквой следующего не учитывая регистр. Каждое слово должно участвовать 1 раз.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (371)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Е К 23 уровень, Краснодар
вчера, 21:12
В примере правильного решения - решили интересно, но слишком уж нагородили этажей + рекурсия. Запомнил слова препода в универе - в программировании не бывает единственно правильного решения... Уж если указывать "правильно решение", то приводить в пример самое оптимальное. Ну или максимально близкое к этому.
Е К 23 уровень, Краснодар
вчера, 21:00
Решил с помощью shuffle - так себе решение на самом деле, а валя принял. Но уже не стал морочиться и переписывать на более благовидное. Где перебираются по очереди слова массива(чтобы быть первыми в цепочке), пока результат не будет удовлетворительным... Кто-то сравнивал с задачей от Боброва в конце Core - не тянет... Хотя и озадачила на пару вечеров.
endurance2296 23 уровень, Киев
позавчера, 08:33
классная задачка) решил с помощью списка, в который добавляются слова при соблюдении главного условия. Ну и цикл while, с проверкой на бесконечный цикл, в который отрабатывает с разными первыми словами. Когда слово в список уже добавлено, добавляем к нему в исходном массиве какие нибудь символы в начало и конец, чтобы оно считалось отработанным. По сути, все зависит от того, какое первое слово будет выбрано, и моя программа перебирает разные сценарии, и заканчивает работу когда первый удовлетворительные сценарий найден.
Андрей Овчаренко 26 уровень, Москва
15 февраля, 15:21
Программа работала слишком долго и была закрыта!
на локальном пк отрабатывает мгновенно. в чём может быть затык??
Роман 24 уровень
16 февраля, 13:42
У меня пока то же самое. Не могу проверить.
6A6JIOMET 23 уровень
27 января, 17:47
Обязательно приводите к нижнему регистру не только первые буквы городов, но и последние. (Хоть они и всегда в нижнем регистре) У меня валидатор не принимал задачу только по этой причине.
Jh-007 31 уровень, Kansk-City
22 января, 07:03
Кто интересно, я сделал такой алгоритм: 1.начинаем строить последовательность с первого элемента, 2. если не получается, перемешиваем исходные данные в случайном порядке, 3. начинаем стоительство опять с первого элемента. Т.к. по условию, всегда есть минимум одно решение, ты рано или поздно мы его найдем. Если повезет, то найдем за один проход.
Kes Чайник в Банк
1 февраля, 01:19
Круто.. ) И сколько по времени проверял валидатор?
Jh-007 31 уровень, Kansk-City
1 февраля, 06:28
Довольно быстро. Точно меньше минуты. Не ожидал, что пройдет с первого раза. Да и вообще не ожидал, хотел проверить предположение.
Tasmity DevOps в Сбер
19 февраля, 06:19
Тот же алгоритм, локально отрабатывает мгновенно, Валидатор выходит с тайм-аутом.
endurance2296 23 уровень, Киев
позавчера, 08:39
зачем перемешивать, если можно просто по порядку ставить первым элементом разные слова и проверять, что в итоге получается?)
Павел 25 уровень, Минск
16 января, 17:35
Напоминаю, это одна из "Задачи по StringBuilder, StringBuffer". Да, именно так. Один только вопрос: тот, кто её сюда поместил, он в этом уверен? Эта задача точно учит работать со StringBuilder и StringBuffer? Всё, чему она учит - это как проср**ь неделю своей жизни на выдумывание бесполезного алгоритма. Не более.
Елена Сижу в декрете
16 декабря 2020, 17:37
Отличная задача! Три дня голову ломала. Сделала рекурсией, вышло почти красиво=)
Kes Чайник в Банк
1 февраля, 01:20
Тоже рекурсией сделал
Судариков Ярослав 33 уровень, Москва
8 декабря 2020, 12:22
Любопытно, на сколько по-разному все ребята подходят к решению одной и той же задачи)) Я делал без рекурсий с одним ArrayList в цикле while true. Получилось не сразу конечно (проблема с последовательностями вроде этой: Трам Нет Труд Муд Дом Мандарин Март) , но когда полез читать комментарии, про рекурсии там, несколько листов для первых, последних букв, так лениво стало переписывать свои ваяния, что решил уж до конца добить))) Не знаю, правда, на сколько мой вариант правильный или эффективный, но он работает. 1) В методе getLine вместо проверки на полученный null ловлю исключение в котором возвращаю пустой стрингбилдер (сначала пытался через проверкку if (words.length == 0) вернуть, но почему то с пустого файла длинна всегда 1 получалась😳 Так и не понял прикола). 2) Потом отпарсил по пробелу words и перекинул строчки с массива в ArrayList. 3) Сделал булевый флажок isEmpty = false, для проверки пуст ли аррай лист, и добавил переменную String lastLatter (куда будет записываться последняя буква последнего добавляемого слова в result) 4) далее цикл while(!isEmpty) а) циклом прохожу по листу, если result пуст сразу добавляю в него list.get(i) при этом удаляя его из листа, и записываю с него последнюю букву в lastLetter с помощью substring. иначе б) проверяю иквалс ли первая буква из list.get(i) c lastLetter. Получаю её так же с помощью substring(0,1): нет, едем дальше по листу, да - добавляем в резалт list.get(i), удалив его из листа и получая последнюю букву ! в конце пунктов а) и б) не забываем вернуться к началу списка: i = -1 5) перед концом while проверяем пуст ли лист: да - булевый флажок переключаем на тру, выходим из цикла и возвращаем резалт нет - очищаем лист(в начале цикла он будет перезаписан по-новому) очищаем резалт - result.delete(0, resultBuilder.length()); и крутимся пока всё не сработает.
Andrei Po 32 уровень
3 декабря 2020, 08:18
1) зря изначально сравнивал и переставлял в том же массиве(ArrayList), не взлетало для всех тестов, а где именно - находить было сложно. 2) переделал (подсказки нашёл в комментах), при сравнении букв строки результата и кандидатов в массиве - при совпадении удалял из массива. 3) сначала искал кандидатов для добавления в конец строки, если больше нет - потом в начало строки. 4) если больше нахождений нет, а длина строки не совпадает с кол-вом слов в начальном массиве - shuffle() начальный массив и заново.(хотя так и не советуют в коментах, но рекурсия у меня туго идёт) для 21 тестового слова - находит за 150-500 попыток. (alpha elephant kick linea android eels kill sum eye spud drink even bee dad num tea test sims apple mob mate)