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

  • 24
  • Недоступна
В методе main считай с консоли имя файла, который содержит слова, разделенные пробелом. В методе getLine используя StringBuilder расставь все слова в таком порядке, чтобы последняя буква данного слова совпадала с первой буквой следующего не учитывая регистр. Каждое слово должно участвовать 1 раз.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (443)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
EK
Уровень 33, Москва, Россия
около 12 часов назад
Привет, коллеги! Поделюсь своим решением, потому что задача сложная. Но я решил её так. Ищем в Интернете любую реализацию генератора перестановок. Например, эту. Пишем простую функцию, которая на вход принимает массив строк и подсчитывает, сколько соседних строк удовлетворяет условию задачи, получаем число в интервале от 0 до размера массива. В генератор перестановок добавляем отбор результатов по значению данной функции (ищем её максимум). В итоге, идеальное решение задачи. Недостаток большой и очевидный: число перестановок равно факториалу размера массива. Поэтому для пяти городов результат вычислялся мгновенно, а вот для примеров, которые привёл здесь пользователь с ником vk, я ответа так и не дождался. Извините, это факториал. Но валидатор принял ответ с первой попытки, и я среди 8877 учеников, которые решили эту задачу 😉
Николай
Уровень 30, Москва
19 января, 08:49
Как всегда в условии очень слабо с примерами. Не работает, хотя на предложенных данных работает? Ищи сам, почему и как, и что хотел автор. Но нам не привыкать)) Задачка интересная, решил с удовольствием. Сначала кажется всё просто, но потом понимаешь, что просто да не очень-то) Решил через связанный массив, куда в цикле добавлял новые слова согласно заданному условию. Сначала пробую добавить в начало цепочки, потом в конец, если не вышло, пытается вставить слово в цепочку. Но нашел в таком алгоритме баг - можно было попасть в петлю, когда первая и последняя буквы цепочки совпадают. Тогда слова еще есть, но добавить их не выходит. Решил добавлением одной проверки в цикле - если такая ситуация появилась, то переставить первое слово в конец. После этого всё заработало. Всё же авторы, добавьте пожалуйста тестовые данные для проверки из комментариев. Например на зацикливание и соответствующий комментарий от валидатора.
antlantis
Уровень 25
16 января, 02:32
Ребята, подскажите пожалуйста, а зачем передаем именно множество строк в метод getLine(String ... words) ? Почему не ссылку на массив ? Если я правильно понял, то множество строк "String words" группируется просто через запятую, это верно? Но в чем задумка этого действия? какая цель? спасибо большое ребята за помощь! без комментов было бы совсем грустно)
Рылов Кирилл
Уровень 35
16 января, 05:19
(String... words) тоже самое, что (String[] words)
antlantis
Уровень 25
16 января, 11:02
Кирилл, спасибо! я не понял тогда, зачем наводится эта путаница, и зачем вообще появилась возможность записывать массив в параметры метода несколькими способами)
trockaya.anzhelika
Уровень 29, Минск
вчера, 09:04
метод с тремя точками, это метод с переменным числом параметров. Можно в него передавать массив. Но, кроме того, String... words позволяет передавать в метод несколько строк через запятую, не создавая массив (эту работу выполняет компилятор)
antlantis
Уровень 25
вчера, 17:15
благодарю вас!
trockaya.anzhelika
Уровень 29, Минск
11 января, 08:58
Ура 8822-ая! Заминка была с тем, что я думала, что слова будут обязательно заканчиваться маленькими буквами, а начинаться с больших, сбил пример)
Ilyas Dzhalilov
Уровень 43
позавчера, 21:59
Да, черт возьми. Главное же ведь была проверка. Пока решал одну проблему зачесались руки на рефакторинг. Типо поменьше кода. Правильно говорят, что не надо оптимизировать пока нет рабочего варианта. Какой раз уже на этом попадаюсь.
Бектурсун Жанакеев
Уровень 35, Бишкек
9 января, 12:52
Последний пункт не проходил из-за того, что при чтении у меня BufferedReader не был в try(BufferedReader ....){ } catch{}. Нужно учитывать такие нюансы оказывается
Сергей
Уровень 24, Минск, Беларусь
24 декабря 2021, 06:24
Хотите истерику? Вот так "Валя" принимает решение
}
    }

    }
}
return result;
А вот так нет
}
    }

    }

}
return result;
Sergey Kornilov
Уровень 37, Petropavlovsk, Казахстан
16 декабря 2021, 14:39
Всего эту задачу решили 8748 учеников. Крутая задача. Пока понял что нужно, 2 часа прошло. В общем нужно найти цепочку слов, в которой участвуют все слова из файла. В общем может оказаться ситуация когда попадётся несколько городов с буквой, на которую оканчивается город. И если все города не вытянулись в цепочку, нужно чистить массив и начинать с другого слова, до тех пор пока все слова не вытянутся в 1 цепочку. Это код, для зачистки массивов и начала разматывания цепочки слов for (String st : words) {list.add(st);} result.clear(); Collections.shuffle(list); result.add(list.get(0)); list.remove(0);
Олег Рудченко
Уровень 26, Новосибирск, Russian Federation
14 декабря 2021, 05:38
Все задачи с этой лекции требуют навыков детектива Коломбо блин. Что бы что-то решить нужно для начала залезть в голову того, кто писал эти условия.
Razorka
Уровень 37, Новосибирск, Россия
6 декабря 2021, 10:41
Да уж, от себя я такого не ожидала. Написала рекурсивный метод, который для переданного слова возвращает Map <String, Integer>, где ключи - все варианты строк, начинающихся с переданного слова, а значения - количества слов, из которых состоит каждая строка. В самом методе getLine() для каждого слова из переданного массива получаю Map, затем беру из нее максимально длинный вариант строки (максимум по значениям), и, если этот максимум == длине переданного массива, то запихиваю строку в StringBuilder и вывожу. В противном случае, если количество слов больше предыдущего найденного максимума (для слов, которые были проверены до текущего слова), то сохраняю это количество, как максимум, а строку, ему соответствующую, в текущий лучший результат (StringBuilder). Когда все слова в массиве пройдены, к текущему лучшему результату добавляю неиспользованные слова (хотя это оказалась необязательно) и вывожу. И вот все работает, все тесты проходятся отлично, но Валя не принимает. Уже перечитала все комменты, казалось бы, все учла, но... В общем, перед первым словом в файле, откуда потом происходит чтение, я добавляла пробел (потому что в предыдущих задачах намучилась из-за того, что первое слово без пробела никак не распознавалось, как слово), а когда запихивала слова после сплита в List, то начинала цикл не с 0, а с 1 (гениальное решение, чтобы не добавлять пустую строку, которая из-за пробела перед первым словом и образуется). Вот это валидатору и не нравилось. Начала цикл добавления с 0 - и получила зеленые кружочки! Кстати, когда убрала пробел, с распознаванием первого слова проблем в этот раз не возникло. Не повторяйте моей ошибки.
Александр
Уровень 35, Москва, Russian Federation
5 декабря 2021, 13:40
В этот раз даже комментарии не помогли понять требования задачи. 1. Я правильно понимаю, что из перечня городов нужно взять любой случайным образом и составить относительно него цепочку? 2. Нужно ли выстраивать максимально длинную цепочку? Например, первое звено в цепочке - Тагил. В списке присутствуют Лилль, Липецк и Льеж. Очевидно, что Лилль прерывает цепочку, тогда как Липцек и Льеж могут ее продолжить. Поэтому Лилль не используем? 3. Если в пункте 1 случайно выпадает Лилль - игра заканчивается, не начавшись? 4. Белич Максим пишет в комментариях, что вопреки допущению: "Считай, что абсолютно все слова из исходного списка могут (и должны!) быть включены в результат (лишних слов нет)", лишние города все таки могут оставаться.
smart_engineer
Уровень 36, Россия
14 января, 23:03
нужно найти именно такой порядок чтобы использовались все слова из списка.