【问题标题】:Remove duplicate numbers in an array in C:删除 C 中数组中的重复数字:
【发布时间】:2016-02-24 01:48:13
【问题描述】:
#include <stdio.h>

int main()
{
    int array[20], t = 0; //20-t is the new size of array.

    for(int i = 0; i<20; i++)
        scanf("%d", &array[i]);

    for(int i = 0; i<20-t; i++)
    {
        for(int j = i+1; j<20-t; j++)
        {
            if(array[i] == array[j])
            {
                for(int z = j; z<20-t; z++)
                    array[z] = array[z+1];//shift numbers.
                    t++; 
                    i = -1;
            }
        }
    }
}

这个程序运行良好,但我不知道为什么它在 i = -1 时运行,但在 i = 0 时不运行?我也想知道这段代码的复杂度。

for(int i = 0; i<20-t; i++)
    printf("%d ", array[i]); //Array after duplicates have been removed.
    return 0;
}

【问题讨论】:

  • 发布的代码有几个“神奇”数字 20 的实例。这使得代码更难以理解、调试和维护。建议使用#define 为“魔术”数字指定一个有意义的名称,并在整个代码中使用该有意义的名称

标签: c arrays algorithm duplicates complexity-theory


【解决方案1】:

如果你按以下方式编写程序

#include <stdio.h>

#define N   20

int main( void )
{
    int a[N];
    int n;
    int i;

    for ( i = 0; i < N; i++ ) scanf( "%d", &a[i] );

    n = 0;
    for ( i = 0; i < N; i++ )
    {
        int j = 0;
        while ( j < n && a[i] != a[j] ) ++j;
        if ( j == n ) a[n++] = a[i];
    }

    for ( i = 0; i < n; i++ ) printf( "%d ", a[i] );
    printf( "\n" );

    return 0;
}

那么算法的复杂度将是O( N ^ 2 )。

至于你的算法,那么它的复杂度是 O( N ^ 3 )。

那是你的方法效率较低。

【讨论】:

    【解决方案2】:

    首先,您的内部循环访问 [z, 20-t+1] 中的元素,这是数组之外的 1 个元素。 'shift numbers' 循环应该是:

    for(int z = j; z<20-t-1; z++)
        array[z] = array[z+1];//shift numbers.
    

    要回答您的问题,它适用于i = -1,因为i 将由for-j 循环递增。因此,下一次迭代将为 0(而不是 1,从而跳过 1 个元素)。

    也就是说,您需要做的是减少 j 迭代器,即:

    t++; --j;
    

    它会跑得更快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-28
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2019-03-15
      • 2021-02-20
      相关资源
      最近更新 更多