Array algorithms: max, count, search, average · Алгоритмы для массивов: максимум, подсчет, поиск, среднее
Four classic array jobs
- Most array work is one of four scans: find the maximum, count matches, search for a value, or take an average.
- Each one is a single
forloop over the array, with a variable that remembers something. - Once you know these four, most array problems are a small change to one of them.
Четыре классические задачи с массивами
- Большинство работы с массивами сводится к одному из четырех сканирований: найти максимум, подсчитать совпадения, найти значение или вычислить среднее.
- Каждое из них — это одиночный
forцикл по массиву с переменной, запоминающей результат. - Как только вы освоите эти четыре подхода, большинство задач с массивами решаются небольшим изменением одного из них.
Finding the maximum
- Start by assuming the first item is the biggest:
int best = a[0];. - Then look at the rest. If an item is bigger than
best, it becomes the newbest. - This works for negative numbers too, because you start from a real item, not
0.
Поиск максимума
- Начните с предположения, что первый элемент самый большой:
int best = a[0];. - Затем посмотрите на остальные. Если элемент больше
best, он становится новымbest. - Это работает и для отрицательных чисел, потому что вы начинаете с реального элемента, а не с
0.
Counting with a condition
- A counter starts at
0and adds1each time an item passes a test. - For example, count even numbers by testing
a[i] % 2 == 0inside the loop. - The counter's final value is your answer.
Подсчет с условием
- Счетчик начинается со
0и прибавляет1каждый раз, когда элемент проходит проверку. - Например, подсчет четных чисел с помощью проверки
a[i] % 2 == 0внутри цикла. - Конечное значение счетчика является вашим ответом.
Linear search
- To search, walk the array and compare each item to the target.
- Return the index as soon as you find a match. If the loop ends with no match, return
-1. -1is a common "not found" signal because it is never a valid index.
Линейный поиск
- Для поиска пройдите массив и сравните каждый элемент с целевым.
- Верните индекс сразу после нахождения совпадения. Если цикл завершился без совпадений, верните
-1. -1— частый сигнал "не найдено", поскольку он никогда не бывает допустимым индексом.
Average without integer-division bugs
- Add all the items into an
inttotal, then divide byn. - Dividing two
ints drops the fraction, so cast:(double)total / n. - Return a
doubleso the caller gets the exact average.
Среднее без ошибок целочисленного деления
- Сложите все элементы в общую сумму типа
int, затем разделите наn. - Деление двух
intотбрасывает дробную часть, поэтому сделайте явное преобразование:(double)total / n. - Верните результат типа
double, чтобы вызывающий код получил точное среднее.
Common mistakes
- Start a max or min from the first element, then compare the rest.
- Do not read past the end of the array.
Распространенные ошибки
- Начните поиск максимума или минимума с первого элемента, затем сравнивайте остальные.
- Не выходите за пределы массива.
Now you try
- Pass the array and its length
n, and pick the right "remember" variable for each job. - Do not write a
main— the checker provides one.
Теперь попробуйте сами
- Передавайте массив и его длину
n, и выбирайте правильную переменную-счетчик для каждой задачи. - Не пишите
main— проверяющая система предоставит его.
Scanning an array · Сканирование массива
One pass keeps a running result (max, sum, count) across the array. · Один проход поддерживает накопительный результат (максимум, сумма, счетчик) по всему массиву.
Complete int max(const int a[], int n) so it returns the largest item (assume n >= 1). Start from a[0] so negatives work. Do not write a main. · Заполните int max(const int a[], int n) так, чтобы он возвращал наибольший элемент (предположите, что n >= 1). Начните с a[0], чтобы корректно работать с отрицательными числами. Не пишите main.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.
Complete int count_even(const int a[], int n) so it returns how many items are even. Use % 2. Do not write a main. · Заполните int count_even(const int a[], int n) так, чтобы он возвращал количество четных элементов. Используйте % 2. Не пишите main.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.
Complete int index_of(const int a[], int n, int target) so it returns the index of the first target, or -1 if it is not there. Do not write a main. · Заполните int index_of(const int a[], int n, int target) так, чтобы он возвращал индекс первого ⟨target⟩, или -1, если его нет. Не пишите ни main.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.
Complete double average(const int a[], int n) so it returns the average of the items (assume n >= 1). Cast to avoid integer division. Do not write a main. · Заполните double average(const int a[], int n) так, чтобы он возвращал среднее значение элементов (предположите, что n >= 1). Приведите тип для избежания целочисленного деления. Не пишите main.
Click Run to see the output here. · Нажмите Запустить, чтобы увидеть результат здесь.