А.Шень “Программирование. Теоремы и задачи”
1.2.1 (Обнуление массива)
Вариант 1:
1.2.1 (Обнуление массива)
Вариант 1:
- int mas[max_size] = {0};
Вариант 2:
- int mas[max_size];
- memset(mas,0,sizeof(int) * max_size);
1.2.2 (Подсчет количества объектов) - int mas[max_size];
- . . .
- int zeroesAmount = 0;
- for (int i=0;i<max_size;i++)
- zeroesAmount += mas[i] == 0 ? 1 : 0;
1.2.3 (Копирование массивов) - int a[max_size],b[max_size];
- . . .
- memcpy(b,a,max_size * sizeof(int));
1.2.4 (Максимальный элемент) Вариант 1:
- int a[max_size];
- int max_value = mas[0];
- for (int i=1; i<max_size; i++)
- maxValue = max(max_Value,mas[i]);
Вариант 2:
- int mas[max_size];
- . . .
- int posMaxValue = 0;
- for (int i=1; i<max_size; i++)
- posMaxValue = mas[i] > mas[posMaxValue] ? i : posMaxValue;
В общем случае второй вариант является более предпочтительным. Потому что он отвечает сразу на два вопроса.
1.2.5 (Количество различных элементов в неубывающем массиве)
- int mas[max_size];
- . . .
- int posMaxValue = 0;
- for (int i=1; i<max_size; i++)
- posMaxValue = mas[i] > mas[posMaxValue] ? i : posMaxValue;
1.2.6 (см. 1.2.5 в произвольном массиве. Сложность O(N*N))
Сортировка выбором + 1.2.5
1.2.7 (см. 1.2.5 в произвольном массиве. Сложность О(N*logN))
Пирамидальная или Быстрая сортировка + 1.2.5
1.2.8 (см. 1.2.5 в произвольном массиве. Элементы массива в интервале [0,K]. Сложность O(N + K))
Сортировка подсчетом + 1.2.5
1.2.9 Количество прямоугольных единичных подматрицы
Решение
1.2.10 (Реверс массива)
1.2.11 (Массив X = AB, где A и B – подмассивы. Реверснуть подмассивы и получить X = BA)
- void reverse(vector<int> &mas, int l, int r)
- {
- while (l<r)
- swap(mas[l++],mas[r--]);
- }
Функция reverse из 1.2.10. m – индекс последнего элемента подмассива A.
1.2.12 (Схема Горнера)
- reverse(mas,0,m);
- reverse(mas,m+1,mas.size()-1);
- reverse(mas,0,mas.size()-1);
1.2.17 (Количество уникальных общих элементов в двух строго возрастающих массивах)
- int res = a[0];
- for (int i=0;i<n-1;i++)
- res = res * x + a[i+1];
Данная задача имеет похожую природу, что и процедура слияния двух массивов в MergeSort
- vector<int> a,b;
- . . .
- int commonAmount = 0;
- int posA = 0, posB = 0;
- while (posA < a.size() && posB < b.size())
- {
- if (a[posA] == b[posB])
- {
- commonAmount++;
- posA++;
- posB++;
- }
- else if (a[posA] < b[posB])
- posA++;
- else
- posB++;
- }
1.2.18 (Количество уникальных общих элементов в двух неубывающих массивах)
1.2.19 (Количество различных уникальных элементов в двух неубывающих массивах)
- vector<int> a,b;
- . . .
- int commonAmount = 0;
- int posA = 0, posB = 0;
- while (posA < a.size() && posB < b.size())
- {
- if (a[posA] < b[posB])
- posA++;
- else if (a[posA] > b[posB])
- posB++;
- else
- {
- posA++; posB++;
- while (posA < a.size() && a[posA] == a[posA-1])
- posA++;
- while (posB < b.size() && b[posB] == b[posB-1])
- posB++;
- commonAmount++;
- }
- }
Решение
1.2.20 (Объединить два упорядоченных массива в один)
Модификация функции merge в MergeSort
1.2.21 (Пересечение двух неубывающих массивов)
Решение
1.2.22
1.2.23
1.2.24
1.2.25
1.2.26
1.2.27
1.2.28
1.2.29
1.2.31
1.2.32
1.2.33 (Голландский флаг)
1.2.34
1.2.35
1.2.36
Комментариев нет:
Отправить комментарий