我在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
的任何内容都是无效的。
答案 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 数组。