C-计算数组中相同数字的出现

时间:2018-10-03 02:59:29

标签: c arrays count

我在C中有一个数组,其中:

int buf[4];
buf[0] = 1;
buf[1] = 2;
buf[2] = 5;
buf[3] = 2;

,我想用一个计数器计算数组中有多少个具有相同值的元素。
在上面的示例中,由于数组中有两个2,因此具有相似值的元素数为2

我尝试过:

#include <stdio.h>

int main() {
    int buf[4];
    int i = 0;
    int count = 0;
    buf[0] = 1;
    buf[1] = 2;
    buf[2] = 5;
    buf[3] = 2;
    int length = sizeof(buf) / sizeof(int); 

    for (i=0; i < length; i++) {
        if (buf[i] == buf[i+1]) {
            count++;
        }
    }
    printf("count = %d", count);
    return 0;
 }

但是我得到0作为输出。希望对此有所帮助。


更新

道歉不明确。

第一: 该数组仅限于大小4,因为它涉及4个方向,即左,下,上和右。

第二: 如果数组中至少有2个元素具有相同的值,则接受count。少了一点就不会注册。

示例:

1,2,5,2 
count = 2 since there are two '2's in the array.

1,2,2,2
count = 3 since there are three '2's in the array

1,2,3,4
count = 0 since there are no similarities in the array. Hence this is not accepted.

小于count = 2的任何内容都是无效的。

3 个答案:

答案 0 :(得分:0)

错误的第一件事是,您只比较了buf数组中的相邻值。您必须将所有值相互比较。

如何执行此操作是一个体系结构问题。 David Rankin在评论中建议的方法是一种,使用带有值和计数的结构数组第二,第二种方法是使用哈希表。您需要编写一些代码!祝好运。根据需要寻求更多帮助。

答案 1 :(得分:0)

您正在比较buf[i]buf[i+1]的值。也就是说,您正在将buf[0]buf[1]buf[1]buf[2]等进行比较

您需要的是一个嵌套的for循环,用于将所有buf的值相互比较。

count = 0;
for (i=0; i<4; i++)
{
    for (j=i+1; j<4; j++)
    {
        if (buf[i]==buf[j])
        {
            count++;
        }
    }
}

正如乔纳森·莱夫勒(Jonathan Leffler)所指出的,如果输入包含元素{1,1,1,1},则上述算法中存在问题。预期值为4时,其值为6。

我一直保持下去,因为OP提到他只想检查2以上的值。因此,此方法可能仍然有用。

答案 2 :(得分:0)

您真的很怕值在buf中出现的顺序。当限制为4个值时,处理此问题的唯一基本方法是使用嵌套循环进行传递,以确定匹配的值是什么,然后对buf进行一次传递,再次计算发生次数(和由于您将值限制为4个值,即使有一对匹配项,您的count也仅限于2,因此,您所计数的值没有任何区别)

一个简短的例子是:

#include <stdio.h>

int main (void) {

    int buf[] = {1, 2, 5, 2},
        length = sizeof(buf) / sizeof(int), 
        count = 0,
        same = 0;

    for (int i = 0; i < length - 1; i++)    /* identify what value matches */
        for (int j = i + 1; i < length; i++)
            if (buf[i] == buf[j]) {
                same = buf[i];
                goto saved;     /* jump out of both loops when same found */
            }
    saved:;    /* the lowly, but very useful 'goto' saves the day - again */

    for (int i = 0; i < length; i++)    /* count matching numbers */
        if (buf[i] == same)
            count++;

    printf ("count = %d\n", count);

    return 0;
}

使用/输出示例

$ ./bin/arr_freq_count
count = 2

在值上进行大量遍历时,使用实际的 frequency 数组来完全确定每个值出现的频率只需花费很少的时间,例如

#include <stdio.h>
#include <string.h>
#include <limits.h>

int main (void) {

    int buf[] = {1, 2, 3, 4, 5, 2, 5, 6},
        n = sizeof buf / sizeof *buf,
        max = INT_MIN,
        min = INT_MAX;

    for (int i = 0; i < n; i++) {   /* find max/min for range */
        if (buf[i] > max)
            max = buf[i];
        if (buf[i] < min)
            min = buf[i];
    }

    int range = max - min + 1;      /* max-min elements (inclusive) */
    int freq[range];                /* declare VLA */

    memset (freq, 0, range * sizeof *freq); /* initialize VLA zero */

    for (int i = 0; i < n; i++)     /* loop over buf setting count in freq */
        freq[buf[i]-min]++;

    for (int i = 0; i < range; i++) /* output frequence of values */
        printf ("%d occurs %d times\n", i + min, freq[i]);

    return 0;
}

注意:如果该范围min实际接近INT_MIN而您的{{1 }}接近max-取决于可用的内存量,情况可能会迅速停止)

使用/输出示例

INT_MAX

在编辑并解释了您只能使用4个值之后,编译器应该会优化第一个基本方法。但是,对于超过4个值或需要任何频率(文件中的字符,数组中的重复项等)的频率,请考虑 frequency 数组。