从排序数组中删除重复项
#include <stdio.h>
#include <stdlib.h>
int main() {
int arr[12] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5 };
int temp[12];
int i, j, k, n = 12;
for (i = 0; i < n - 1; i++) {
if (arr[i] != arr[i + 1]) {
temp[j] = arr[i];
j++;
}
}
temp[j] = arr[n - 1];
for (k = 0; k <= j; k++) {
printf("%d\n", temp[k]);
}
return 0;
}
输出:
6356652
1955753237
1956070172
6356716
1955750536
8
1955687363
1955687354
1
2
3
4
5
Process returned 0 (0x0) execution time : 0.014 s
Press any key to continue.
我不希望这些数字被打印出来
6356652
1955753237
1956070172
6356716
1955750536
8
1955687363
1955687354
答案 0 :(得分:4)
您没有初始化变量j
。因此,使用未初始化的变量会调用未定义的行为。
最好在一个循环中形成没有重复的数组,而不是将循环分成一个循环和在循环后再添加一个语句。
例如,可以按照演示程序中显示的以下方式编写单独的函数。
#include <stdio.h>
size_t remove_copy( const int a[], int b[], size_t n )
{
size_t j = 0;
for ( size_t i = 0; i < n; i++ )
{
if ( i == 0 || a[i] != b[j-1] ) b[j++] = a[i];
}
return j;
}
int main(void)
{
int a[] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5 };
int b[sizeof( a ) / sizeof( *a )];
const size_t N = sizeof( a ) / sizeof( *a );
for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
putchar( '\n' );
size_t n = remove_copy( a, b, N );
for ( size_t i = 0; i < n; i++ ) printf( "%d ", b[i] );
putchar( '\n' );
return 0;
}
程序输出为
1 2 2 3 3 3 4 4 4 4 5 5
1 2 3 4 5
答案 1 :(得分:1)
您的代码和逻辑是正确的。但是您没有初始化j = 0
犯了一个错误。因此,您获得了一些胡言乱语的价值。因此,我更正并执行了它,并得到了正确的答案。
#include <stdio.h>
int main() {
int arr[12] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5 };
int temp[12];
int i, j = 0, k, n = 12;
for (i = 0; i < n - 1; i++) {
if (arr[i] != arr[i + 1]) {
temp[j] = arr[i];
j++;
}
}
temp[j] = arr[n - 1];
for (k = 0; k <= j; k++) {
printf("%d\n", temp[k]);
}
return 0;
}