首页 > 解决方案 > 从 C 中的数组中消除 NaN 值

问题描述

我试图清理给定数组示例中的“NaN”变量;我的输入数组 A 是:

float A[] = { 5.0f, NAN, 1.5f, 0.0f, 1.75f };

预期的输出数组 A 是:

{5.0f,1.5f, 0.0f, 1.75f}

我可以删除每个 NAN 并将元素向左移动一次。但是如果数组太大而无法处理,它将成为低效的算法。

我在 C 中找不到任何解决方案。所以我的问题是有没有比这些方法更有效的解决方案?

问候。

标签: arrayscalgorithm

解决方案


有一个O(n)使用两个指针技术的解决方案。可以将所有NaN术语交换到数组的末尾,同时保留非NaN术语的相对顺序。
p记录遇到的非NaN术语数量并返回以跟踪A.

int moveNAN(float A[], int n)
{
    int p = 0;
    for(int i = 0; i < n; ++i)
        if(!isnan(A[i]))  // if `isnan` is not defined use `A[i] == A[i]` (NaN values return false)
        {
            if(p != i)
                swap(A[i], A[p]);
            ++p;
        }
    return p;
}

推荐阅读