Одномерный массив - вроде бы просто? |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Одномерный массив - вроде бы просто? |
Petruxa |
Сообщение
#1
|
Гость |
Ребят помогите пожалуйста, второй день голову ломаю, что-то никак не выходит!
Найти три наименьших по значению элемента одномерного массива (равные не учитывать) целых чисел, введеных с клавы. Заменить их на соответствующие им индексы. Спасибо |
hardcase |
Сообщение
#2
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Простите за откровенный оффтоп (в 3 часа ночи как-то на всё пофиг).
Паскаль было лень запускать (в студии проект ваял), да к тому же корректный ответ уже был размещён... Мне просто не понравилось обилие вложенных циклов в предложенных алгоритмах. Попробовал обойтись одним-двумя. Код // возвращаем последовательность пар: минимум-индекс public static IEnumerable<KeyValuePair<int,int>> FindMins(int minsCount, IEnumerable<int> sequence) { int min = default(int); // максимальный минимум Dictionary<int, int> dict = new Dictionary<int, int>(); int index = -1; // счётчик итераций foreach (int item in sequence) { index++; // забиваем словарь первыми minsCount элементами последовательности if (dict.Count < minsCount && !dict.ContainsKey(item)) { dict.Add(item, index); min = (min != default(int) ? (min < item ? item : min) : item); continue; } // если следующий элемент меньше текущего (максимального) минимума // перетряхиваем словарь if (item < min && !dict.ContainsKey(item)) { dict.Remove(min); // удаляем старый минимум dict.Add(item, index); // добавляем новый // обновляем максимальный минимум min = item; foreach (int dictItem in dict.Keys) { min = min < dictItem ? dictItem : min; } } } return dict; // возвращаем последовательность минимальных элементов и их индексов } Полагаю из имён методов ясно их назначение. Кроме того можно избавиться от вложенного цикла, используя сортированный список из ключей. Ещё была мысль тупо отсортировать по возрастанию массив квик-сортом с сохранением начальных позиций элементов, а потом взять minsCount первых неравных элементов...... но я уснул на клаве...... -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Текстовая версия | 29.04.2024 10:12 |