代码之家  ›  专栏  ›  技术社区  ›  Maxxx

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

  •  0
  • Maxxx  · 技术社区  · 7 年前

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

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

    我想计算数组中有多少元素与计数器具有相同的值。
    在上面的示例中,具有类似值的元素的数目是 2 因为有两个 数组中的S。

    我试过:

    #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 因为它涉及 方向,左,下,上,右。

    第二: 如果至少有 数组中具有相同值的元素, 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 回复  |  直到 7 年前
        1
  •  0
  •   David C. Rankin    7 年前

    你真的被价值观出现的顺序给吓坏了。 buf . 当限制为4个值时,处理此问题的唯一基本方法是使用嵌套循环进行传递,以确定匹配值是什么,然后进行单个传递。 缓冲器 再次计算它发生的次数(并且由于您限制为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
    

    在传递这些值的过程中,使用 频率 数组以完全确定每个值发生的频率,例如

    #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 你的 max 接近 INT_MAX --根据可用的内存量,事情可能会很快停止)

    示例使用/输出

    $ ./bin/freq_arr
    1 occurs 1 times
    2 occurs 2 times
    3 occurs 1 times
    4 occurs 1 times
    5 occurs 2 times
    6 occurs 1 times
    

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

        2
  •  0
  •   Leonard    7 年前

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

    如何做到这一点是一个体系结构问题。DavidRankin在注释中建议的方法是一种,使用带有值和计数的结构数组是第二种方法,使用哈希表是第三种方法。你有一些编码工作要做!祝你好运。需要时寻求更多帮助。

        3
  •  0
  •   Rishikesh Raje    7 年前

    你正在比较 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。

    我会继续跟进的,正如运营商所说,他只想检查以上2项。因此,这种方法可能仍然有用。