Задача по алгоритмам

  • 12
  • Недоступна
Вместо кубиков жители планеты Линейный Хаос дают своим детям решать задачки на сортировку. Вот вам одна из забавок маленьких упорядоченных изоморфиков, развлекитесь, как следует: после того, как пользователь введет с клавиатуры список слов (и чисел), программа должна вывести слова в возрастающем порядке, а числа — в убывающем.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (237)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Колян Мельников10 уровень, Минск
2 часа назад
решал так: 1 for (int i < длина массива -1; i >= 1; i --){ 2 for (int j = 0; j < i; j++); 1 if (проверяем явлеятся ли ячейка i массива числом через isNumber && аналогично для j) 2 if (через parseInt сравниваем i и j) пузырек для чисел; 3 if (проверяем не является ли ячейка i массива числом через !isNumber && аналогично для j) 4 if (метод isGreaterThan(i, j)) пузырек для строк; и в самом начале поменял условие с s.equals(null) на s == null
Игорь Гакотин10 уровень, Москва
7 часов назад
Максимально ванильное решение, через пузырьковую сортировку, выдает такое же решение, как и у автора задачи. Каждая итерация для чисел будет выглядеть так. Для строк аналогично.
if (isNumber(array[j])) {
                    int nextIndex = getNextNumberIndex(array, j);
                    if (nextIndex != -1)
                        if (Integer.parseInt(array[j]) < Integer.parseInt(array[nextIndex]))
                            swap(array, j, nextIndex);
                }
Сергей11 уровень, Екатеринбург
позавчера, 13:44
Запоминал индексы последних предыдущих строк и чисел
Павел Минеев16 уровень, Челябинск
вторник, 19:43
За пол часа родил следующее: 1. Создал 4 ArrayList'а, 1 из которых стринговый (запихивал туда строки), три оставшихся Integer (один для чисел, два других для хранения индексов по которым в исходном массиве находятся числа/строки); 2. В цикле по длине исходного массива строк с помощью метода isNumber числа распихивал в один лист
nums.add(Integer.parseInt(array[i]))
запоминая при этом индекс этого числа в исходном массиве загоняя его в другой лист
numI.add(i);
А строки с их индексами в другой
strs.add(array[i]);
strI.add(i);
3. Лист со строками отсортировал пузырьком (сам долго смеялся) используя метод isGreaterThan. 4. Лист с числами отсортировал используя методы класса Collections
Collections.sort(nums);
Collections.reverse(nums);
5. Распихал отсортированные листы обратно в array. На примере с числами:
for (int i = 0; i < numI.size(); i++) {
    array[numI.get(i)] = nums.get(i).toString();
}
Для ясности лист numl содержит индексы по которым в исходном массиве находятся числа, strI - индексы строк, nums и strs - непосредственно листы с числами и строками. В итоге может и не самое изящное решение, но зато не пришлось придумывать и реализовывать ветвистых алгоритмов, которые на следующий день и сам не понимаешь.
Денис10 уровень, Москва
вчера, 22:02
А со строками как? Мне вообще пришлось под требования писать "boolean temp = isGreaterThan("a", "b");" так как строки тоже методом sort класса Collections отсортировал Collections.sort(b, (o1, o2) -> o1.compareTo(o2));
Павел Минеев16 уровень, Челябинск
9 часов назад
Именно поэтому я и сортировал строки пузырьком, а не sort-ом, чтобы использовать этот самый isGreaterThan согласно требованию валидатора.
Venitarx14 уровень, Москва
14 августа, 11:42
1. Заводим двойной for для перебора массива; 2. Первый if если сравниваемые arr[i] arr[j] это не числа - прогоняем методом isGreaterThan; 3. Второй if если сравниваемые arr[i] arr[j] числа: - переводим строки в числа методом Integer.parseInt(String); - сравниваем между собой и меняем местами, если нужно; - присваиваем элементам массива значения, предварительно вернув их в String методом Integer.toString(int); 4. Profit!
omat_kisat14 уровень, MIPS Assembly
вторник, 13:03
можно парсить для сравнения:
if (Integer.parseInt(array[i]) > Integer.parseInt(array[j]))
и не менять тип данных в массиве, ну и временные переменные для бабблсорта тоже стрингами объявить.
omat_kisat14 уровень, MIPS Assembly
вторник, 13:12
в смысле, если запарсенное никуда не сохранять, оно запарсится только для сравнения, но никуда не сохранится, и дальше можно будет пользоваться только стрингами.
Venitarx14 уровень, Москва
позавчера, 12:35
Кстати, разумно. Экономит n-ное количество строк.
Dmitrii Sulimov16 уровень
8 августа, 19:23
Сидел ломал голову над тем, что на сайте выкидывало NullPointerException, решил все-таки отправить на проверку и все заработало с первого раза. Чудеса...
Владислав16 уровень, Москва
8 августа, 11:07
решил)
Andrei Smirnov14 уровень, Тольятти
4 августа, 11:34
Обобщенный алгоритм моего решения: Для сравнения строк использовал готовый метод isGreaterThan(), но для сравнения чисел использовал явное приведение к числу.
Ильяс35 уровень, Москва
3 августа, 09:30
Viktor Gromov11 уровень
2 августа, 19:05
Уже вторая задачка в этом блоке, которая непонятно почему не хочет засчитываться. Да, я понимаю, что я сделал не лучший код, но и проблема не в этом. Тут проблема возникла в том, что он почему-то не видел мое использование isGreaterThat(String,String). Хотя оно было! Я ввел его в if, он не хотел принимать. Вывел из if на строку выше, сделал отдельную boolean переменную - не сработало! Вышло только тогда, когда я его вывел целиком из цикла и написал просто рандомные значения в методе (просто выше цикла написал isGreaterThatn("fef", "wadakfaf") или т.п. До этого не хотел принимать в задачке с копированием данных в файле. Хотя он прекрасно все копировал, отображалась ошибка, что он якобы не копирует полностью файл. В итоге спасло просто перемещение (!) объявления OutputStream объекта. Пипец.