1

我正在寻找一种干净整洁的方法来查看数组中是否有三个相等的数字。

现在我有这个:

for (int i = 0; i < nr ; i++)
{
    if(a[i] == 1){one++;}
    else if(a[i] == 2){two++;}
    else if(a[i] == 3){three++;}
    else if(a[i] == 4){four++;}
    else if(a[i] == 5){five++;}
    else if(a[i] == 6){six++;}
}

if(one >= 3){
    printf("Tre tal finns i ettor, 3p\n");
}else if(two >= 3){
    printf("Tre tal finns i tvår, 6p\n");
}else if(three >= 3){
    printf("Tre tal finns i treor, 9p\n");
}else if(four >= 3){
    printf("Tre tal finns i fyror, 12p\n");
}else if(five >= 3){
    printf("Tre tal finns i femmor, 15p\n");
}else if(six >= 3){
    printf("Tre tal finns i sexor, 18p\n");
}

其中a(整数)是5个元素的数组(包含元素1-6),“nr”是跟踪数组长度的变量。

如果有人有更好更好的方法来做到这一点,请回复。

4

4 回答 4

6

将其推广为直方图,并基本上执行计数排序的第一步:

int histogram[n]; //variable length array are fine in c99, if using older c - malloc
for (int i = 0; i < n; i++) histogram[i] = 0; //init
for (i = 0; i < nr; i++)
   histogram[a[i]]++;
for (i = 0; i < n; i++)
   if (histogram[i] >= 3) //found it
//....    
于 2013-10-15T09:51:29.143 回答
3

我想使用 switch-case 作为:

switch((a[i]){
 case 1: one++;
         break;
 case 2: two++;
         break;
 case 3: three++;
         break;
 case 4: four++;
         break;
 case 5: five++;
         break;
 case 6: six++;
         break;
 //default: if you want to add 
}
于 2013-10-15T09:51:48.453 回答
0

他们必须挨着吗?那么你只需要一个标志变量。

确实,如果它不关心你,如果你重复了不止一个数字,但只知道它们存在,那就更好了。

于 2013-10-15T09:55:04.430 回答
0

如果您想要一个真正通用的解决方案,请对输入数组进行排序;一旦排序,找到一个数字出现超过n次的所有实例,无论你想要什么n ,都变得微不足道。

如果您想要更有限的域或更针对性的解决方案,那么其他人已经给了您一些很好的提示。

于 2013-10-15T09:59:06.100 回答