此声明的含义计数[array [i]]

时间:2014-11-23 12:38:40

标签: c++ c

任何人都可以在下面的程序中解释count[array[i]]的含义吗? 代码的目的是在数组中打印带频率的所有重复数字。

#include <stdio.h>
#include <malloc.h>

void duplicate(int array[], int num)
{
    int *count = (int *)calloc(sizeof(int), (num - 2));
    int i;

    printf("duplicate elements present in the given array are ");
    for (i = 0; i < num; i++)
    {
        if (count[array[i]] == 1)
            printf(" %d ", array[i]);
        else
            count[array[i]]++;
    }
}

int main()
{
    int array[] = {5, 10, 10, 2, 1, 4, 2};
    int array_freq = sizeof(array) / sizeof(array[0]);
    duplicate(array, array_freq);
    getchar();
    return 0;
}

3 个答案:

答案 0 :(得分:1)

这是用于在数组中查找重复项的更糟糕的方法。

count[array[i]]++;

因此,array[i]将返回该索引处的数字,该数字又将作为count数组的索引。例如: -

array[4] = {1,2,3,1};

将数组迭代到这将是: -

count[array[0]] = count[1] = 1;
count[array[1]] = count[2] = 1;
count[array[2]] = count[3] = 1;
count[array[3]] = count[1] = 2; << Increment the count...

答案 1 :(得分:1)

如果我做对了。您正在尝试打印给定数组中的所有重复项。 首先,创建一个数组计数并用零填充它。

int *count = (int *)calloc(sizeof(int), (num - 2));

如果count [x]等于0,则表示数字x未出现在数组中。 如果count [x]等于1,则意味着数组中只有一个x实例。 如果count [x]大于1则意味着数组中有多于一个x的实例。

因此,您将浏览给定的数组并更新计数数组。同时更新你正在检查是否有任何重复。这就是这些行:

if (count[array[i]] == 1)
    printf(" %d ", array[i]);
else
    count[array[i]]++;

从我的观点来看,这不是做这种常规的最好方法。我现在可以看到的两个问题是:你没有释放count数组,count数组的大小必须大于给定数组中的任何数字。作为另一种解决方案,您尝试使用std :: set或std :: unique函数来思考如何完成此任务。

希望它有所帮助。

答案 2 :(得分:0)

你展示的代码毫无意义。例如,函数calloc的第一个参数是必须分配的元素数。但是在您的代码中,相应的参数是sizeof(int),通常等于4.函数的第二个参数是元素的大小。但是在程序中指定了num - 2(?)。虽然calloc分配的内存范围等于第二个参数的第一个参数的乘积但是完全不清楚为什么使用num - 2

至于这个表达式count[array[i]]那么这是一个明显的错误。 array [i]的值可能远大于动态内存中已分配元素的数量。

因为很明显你可以将这个表达式逻辑地分成两部分。例如

int j = array[i];
count[j];

例如对于数组

int array[] = {5, 10, 10, 2, 1, 4, 2};

array[1]等于10.因此count[array[i]]等同于count[10]但是只有num - 2元素被指定为count。由于在这种特殊情况下num - 2等于5,因此count [10]是数组中不存在的元素。

考虑到一般情况下你需要自由动态分配的内存。

我认为你的意思是以下

#include <stdio.h>
#include <stdlib.h>

void duplicate( const int a[], size_t n )
{
    size_t *count;
    int i;

    if ( n < 2 ) return;

    count = ( size_t * )calloc( n - 1, sizeof( size_t ) );

    for ( i = 1; i < n; i++ )
    {
        size_t j = 0;
        while ( j < i && a[i] != a[j] ) j++;

        if ( j != i ) ++count[j];
    }

    printf( "duplicate elements present in the given array are " );
    for ( i = 0; i < n - 1; i++ )
    {
        if ( count[i] )
        {
            printf( " %d ", a[i] );
        }
    }

    free( count );
}

int main(void) 
{
    int a[] = { 5, 10, 10, 2, 1, 4, 2 };
    size_t n = sizeof( a ) / sizeof( *a );

    duplicate( a, n );

    return 0;
}

输出

duplicate elements present in the given array are  10  2

如果要替换陈述

printf( " %d ", a[i] );

printf( " %d(%zu) ", a[i], count[i] + 1 );

然后输出

duplicate elements present in the given array are  10(2)  2(2)

如果您将使用我的代码,那么请不要忘记将我的答案标记为最佳。:)