Напишите программу, которая определяет, является ли массив размера N
перестановкой числе над 1,2...N
(т. е. содержащих каждое из чисел 1,2...N
ровно один раз.
#include <stdio.h>
#include "test.h"
#define N 9
/**
* Определяет, является ли данный массив перестановкой над N, т.е.
* массив array[N] содержит все числа от 1 до N, включительно.
* Например: 1,3,4,2,5,7,6,9,8 - является перестановкойнад 9.
* 1,2,4,3,3,5,2,8,9 - не является перестановкой.
*
* Подсказки:
* - создайте вспомогательный массив размера N;
* - задачу можно решить за O(N);
*
* @param array Массив, который проверяем на перестановку
* @return Возвращает 1, если является перестановкой, иначе 0.
*/
int is_permutation(int array[N]) {
int counters[N];
for (int i = 0; i < N; i++) {
counters[i] = 0;
}
// array = 1 3 4 1 5 7 6 9 8
// counters = 2 0 1 1 1 1 1 1 1
for (int i = 0; i < N; i++) {
int key = array[i] - 1;
if (array[i] < 0 || key >= N) {
return 0;
}
counters[key] += 1;
if (counters[key] > 1) {
return 0;
}
}
// проверка что все элементы 1 не нужна
return 1;
}
void test(void) {
// Это тесты. НЕ УДАЛЯЙТЕ ИХ!
// Преподаватель будет грустить, если вы удалите тесты T_T.
// Тесты проверяют, что ваш код работает правильно.
// Если задача решена неправильно,
// то в консоли вы увидите ошибку и пояснение.
// Сдавайте лабу, когда устраните все ошибки в тестах.
// Если возникли трудности, то попросите преподавателя вам помочь ^_^.
{
int arr[N] = {1, 3, 4, 2, 5, 7, 6, 9, 8};
ASSERT_TRUE(is_permutation(arr));
}
{
int arr[N] = {8, 3, 4, 2, 5, 9, 6, 7, 1};
ASSERT_TRUE(is_permutation(arr));
}
{
int arr[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
ASSERT_TRUE(is_permutation(arr));
}
{
int arr[N] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
ASSERT_FALSE(is_permutation(arr));
}
{
int arr[N] = {1, 2, 4, 3, 3, 5, 2, 8, 9};
ASSERT_FALSE(is_permutation(arr));
}
}
int main(void) {
test();
return 0;
}