C 删除数组中的重复数字:
Remove duplicate numbers in an array in C:
#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;
}
首先,您的内循环访问 [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;
它将 运行 更快!
如果你这样写程序
#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 )。
那是你的方法效率低下。
#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;
}
首先,您的内循环访问 [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;
它将 运行 更快!
如果你这样写程序
#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 )。
那是你的方法效率低下。