【问题标题】:How can I find one unsorted element in otherwise sorted array? (In C)如何在其他已排序的数组中找到一个未排序的元素? (在 C 中)
【发布时间】:2020-10-27 20:49:35
【问题描述】:

这些是 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) 对数组进行排序。

【问题讨论】:

  • 如果你的算法永远不会返回size-1(这是你的7),你如何期望它?
  • 抱歉打错字了。它应该是 70。我只是编辑它以反映更正。
  • 刚刚改了,谢谢,但变量异常值仍然被赋值为 6 而不是 7。@EugeneSh。

标签: arrays c sorting


【解决方案1】:
如果满足以下条件,则

元素 x 不被视为异常值:

previous <= x <= next

有时一个元素没有previousnext(数组两边的元素)。在这种情况下,总是可以制作限制MINMAX,所有数组元素都落在它们之间。

这样的事情应该可以工作:

#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
}

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2020-05-01
    相关资源
    最近更新 更多