Обращенные слова

  • 24
  • Недоступна
В методе main с консоли считать имя файла, который содержит слова, разделенные пробелами. Найти в тексте все пары слов, которые являются обращением друг друга. Добавить их в result. Использовать StringBuilder. Кодировка файла - UTF-8.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (350)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Сергей Смирнов
Уровень 33
позавчера, 04:41
String first = "рот"; String second = "тор" String first = "тор"; String second = "рот" Это разные пэйры или один и тот же? В лист добавлять оба варианта или один из них? А добавлять только уникальные пэйры или они могут повторяться? Без понимания этих моментов мы просто в угадайку играем и тратим время.
01000101
Уровень 33, Минск, Belarus
10 июня, 08:24
Считал слова в список. Обычный цикл for по списку, без Iterator. Заношу слово в переменную и удаляю тут же из списка. После этого в оставшемся списке ищу палиндром для считанного. Если нашёл, в result закидываю Pair и удаляю палиндром из списка тоже. В конце шага в любом случае i-- (т.е. с тем же успехом можно было постоянно работать с listOfWords[0]). ЗЫ Успешно протестировал все варианты от Дианы Чиганцевой (в комментах чуть порыщите).
Artem Trainee в Deutsche Telekom
19 июня, 05:36
сделал по Вашей методе. варианты от Дианы прошли все кроме 4-го, в нем поменялся порядок пар. Валя не принимает :(
Oulina Full Stack Developer в Фриланс
6 июня, 09:30
Варианты входных данных от Диана Чиганцева очень помогли
Dmitriy
Уровень 28, Москва, Россия
2 июня, 14:17
Итак, после чтения файла у нас массив (ArrayList) String. Запускаем цикл. Проверяем, что элемент массива.get(i) содержится в этом же массиве, но в перевернутом виде и индексы не совпадают
String stringToCompare = new StringBuilder(list.get(i)).reverse().toString();
 if (list.contains(stringToCompare) && list.lastIndexOf(stringToCompare) != i){
true: конструируем Pair и заносим в result. Убираем из массива и прямое и перевернутое слова (.remove(Obj). i-- все Протестировано на всех примерах. Валидатор принял
NonGrata
Уровень 35, Israel
5 июня, 15:47
Круто, помог
Anonymous #3036451
Уровень 27, Falls Church, United States
2 июня, 07:02
1. В списке result могут быть повторяющиеся пары. Фильтровать на уникальность не надо. 2. Можно обойтись без циклов в цикле и добавлять пары прямо в момент чтения файла, т. н. однопроходный алгоритм: 1) Создаем ArrayList<String> words. 2) Получаем и буфера строку и разбиваем ее на слова. Для каждого слова: 1) Получаем его реверс. 2) Ищем реверс в words. 2.1) Нашли реверс. Создали пару (реверс и слово поменяли местами). Удалили реверс из words 2.2) Не нашли реверс. Добавили слово в words. ИМХО, оптимальный алгоритм и по памяти (в листе только слова которым не нашли пару, а не весь файл) и по сложности (поиск в листе меньшего размера)
Стас
Уровень 26, Санкт-Петербург, Россия
20 мая, 12:32
Задача описана не до конца, пока вы в result должны попадать в том числе и повторяющиеся сочетания, но при этом слова которые уже нашли пару и попали в result должны удаляться из обрабатываемого списка. Пока вы этого не добьетесь валидатор вас не пропустит, но и что не так - не скажет. Задачка на умение читать мысли составителя задачи)
SoSed
Уровень 38, Киев, Ukraine
12 апреля, 09:56
Кстати, в задании сказано, что должен существовать конструктор без параметров, но, ведь, не сказано, что других конструкторов быть не должно! Думал, валидатор не примет если будет второй конструктор (с двумя строками в аргументах), но попробовал. Принимает) Решил через массив строк. Без коллекций.
Yuri_S Инженер-конструктор 2к.
29 марта, 11:54
Решил так: 1. Слова из файла загнал в Лист 2. Клонировал Лист и сделал для каждого слова reverse. 3. Сделал цикл-в-цикле - сравнивал слова из первого Листа со словами из второго Листа по правилу:
(i != j && words.get(i).equals(reverseWords.get(j)) && words.get(j).equals(reverseWords.get(i)))
- индексы не должны быть равны (отсеиваем одиночные палиндромы) - если у слова (И) нашлась пара (ЖИ) в реверснутом массиве, проверяем чтобы и у слова в позиции (ЖИ) была пара (И) в реверснутом массиве - если "перекрестная пара" найдена - значит обращение существует, добавляем его в список Пар и аккуратно удаляем перекрестную пару (4 элемента) из двух массивов, откатываем счетчик (ЖИ) на 2 позиции, счетчик (И) не трогаем. Всё!
UnnamedRoad
Уровень 37, Оренбург, Россия
26 марта, 15:40
Пусть с 16 попытки, но я всё же победил 😀 наверное мой новый рекорд
Mikhail Efimov
Уровень 35, Санкт-Петербург, Россия
20 марта, 09:05
Просто создал метод, который считает дубликаты и затем добавляет в список пары вторым методом сравнивал строки в массиве (перевел каждую строку в массив символов, отсортировал и сравнил) и валидатор пропустил. Главное помнить что валидатор может накидать вам кучу пустых строк в примере, которые можно обходить trimToSize() и то, что каждая пара одинаковых элементов тоже является парой Код очень грязный получился, но какое условие, такой и код)))