Как заменить все максимальные элементы на минимальные в вектор (использовать только алгоритмы стандартной библиотеки шаблонов):
На С++.
Ответы
Первым делом нужно выяснить общность вопроса.
Нам нужно заменить максимальные элементы (максимальные элементы - это одинаковые элементы с максимальным значением в векторе) минимальным.
Как наиболее проще это сделать?
Для начала нам нужно найти минимальный и максимальный элементы. Сразу отбрасываем варианты со всякими поисками минимумов / максимумов и вспоминаем о сортировке. Для удобства - по возрастанию, так как нам не нужно проходить весь вектор до конца. После сортировки максимальные элементы будут вначале.
Итак, мы отсортировали вектор, максимальные элементы вначале, а минимальный - в конце. Описываем цикл:
- for (int i = 0, temp = arr[i]; i < arr.size(); ++i)
Здесь стоит пояснить: i - итератор, это понятно, temp же - целочисленная переменная, с начала цикла хранящая элемент вектора под индексом 0: arr[0], то есть максимальный элемент.
Внутри цикла мы проверяем, является ли i-й элемент максимальным, то есть, по сути, проходим все максимальные элементы с самого начала:
- if (arr[i] == temp)
- {
- arr[i] = arr[arr.size() - 1];
- }
Здесь arr[arr.size() - 1] - всегда минимальный элемент.
Рассмотрим на примере
Вектор после ввода 7 элементов: -1, 0, 8, -1, 8, 6, 4.
После сортировки: 8, 8, 6, 4, 0, -1, -1
Начало цикла:
i = 0: temp = arr[i] = arr[0] = 8
arr[0] == temp? ⇒ 8 == 8? true ⇒ arr[0] = arr[7 - 1] = -1
i = 1: temp = 8
arr[1] == temp? ⇒ 8 == 8? true ⇒ arr[1] = arr[7 - 1] = -1
i = 2: temp = 8
arr[2] == temp? ⇒ 6 == 8? false ⇒ выход из цикла
Вектор в конце: -1 -1 6 4 0 -1 -1
Код на языке C++
- #include <iostream>
- #include <vector>
- #include <algorithm>
- int main()
- {
- int arrLength = 0;
- std::vector<int> arr;
- std::cout << "Input array length: ";
- do
- {
- std::cin >> arrLength;
- if (arrLength <= 0)
- {
- std::cout << "Error: vector size must be natural!" << std::endl;
- }
- } while (arrLength <= 0);
- for (int i = 0, inputValue = 0; i < arrLength; ++i)
- {
- std::cout << "Input element: ";
- std::cin >> inputValue;
- arr.push_back(inputValue);
- }
- std::sort(arr.rbegin(), arr.rend());
- std::cout << "Array before: ";
- for (int i = 0; i < arr.size(); ++i)
- {
- std::cout << arr[i] << " ";
- }
- for (int i = 0, temp = arr[i]; i < arr.size(); ++i)
- {
- if (arr[i] == temp)
- {
- arr[i] = arr[arr.size() - 1];
- }
- else break;
- }
- std::cout << "\nArray after: ";
- for (int i = 0; i < arr.size(); ++i)
- {
- std::cout << arr[i] << " ";
- }
- return 0;
- }
1 2 3 4 5 6 7 9 9 заменить последние две девятки на 1?