Это 3 тестовых случая, в которых они отсортированы, за исключением одного неуместного элемента:

{-17, -5, -5, -2, 1, 17, 289, 17, 17, 395} | Индекс неуместного элемента равен 6.

{289, 17, 17, 17, 100, 250, 300, 1000, 5000} | Индекс неуместного элемента равен 0.

{-1, 23, 70, 500, 1000, 7000, 23520, 10} | Индекс неуместного элемента равен 7.

Вот код, который у меня есть:

int outlier;
int size = sizeof(arr) / sizeof(int)
for (int i = 0; i < size - 1; i++) {
  if (arr[i] > arr[i + 1])
    outlier = i;
}

Для первого тестового примера выброс - 6, что верно. Для второго тестового примера выброс равен 0, что также верно. Однако, когда я пробую его на третьем массиве, я получаю выброс как 6, что не является положением элемента в неправильной позиции. Он должен быть равен 7. Цель состоит в том, чтобы написать функцию для: a) поиска индекса элемента, в котором он не отсортирован, и b) сортировки массива.

1
g3or3 27 Окт 2020 в 23:49

2 ответа

Лучший ответ

Элемент x не считается выбросом, если верно следующее:

previous <= x <= next

Иногда у элемента нет предыдущего или следующего (элементов на обоих краях массива). В этом случае всегда можно придумать пределы MIN и MAX, между которыми попадают все элементы массива.

Примерно так должно работать:

#include <stdio.h>
#define MAX (int) 1e6
#define MIN (int) -1e6

int main() {
    int arr[] = {-1, 23, 70, 500, 1000, 7000, 23520, 10};
    int size = 8;
    int outlier;
    int prev, x, next;
    for (int i = 0; i < size; i++) {
        if (i == 0) prev = MIN;
        else prev = arr[i - 1];

        if (i == size - 1) next = MAX;
        else next = arr[i + 1];

        x = arr[i];

        if (!(prev <= x && x <= next) && prev <= next) {
            outlier = i;
            break;
        }
    }
    printf("%d\n", outlier); // outputs 7
}
-1
Janez Kuhar 1 Ноя 2020 в 11:11
int find(int *array, int size)
{
    for (int i = 1; i < size; i++)
    {
        if (array[i] < array[i - 1])
            return i - 1;
    }
}

С вашим кодом в последнем тестовом примере вы смотрите за пределы своего массива. Чтобы исправить это, вы должны вместо этого сравнить текущий индекс с предыдущим, начиная с индекса 1. Этот код написан на C ++, но я думаю, что он также работает в c.

-1
V0_1D 27 Окт 2020 в 21:36