课堂练习_水桶
一、问题描述
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。
据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
二、解决思想
根据上一次水王的方法,我这次试用的还是“消消乐”的方法,不过与上次不同的是,在这次的代码中,计数器变成了三个,
同时,由一个“水王”,变成了三个“水桶”,思想和上次的一样。
三、源代码
//田永涛 //2015.4.25 #include "stdafx.h" #include <stdio.h> #define Length 21 //设置最大长度为100 int MIN(int num[]) //求出count[]中最小的数,以便减1 { int min; min = num[1]; for(int i=1;i<3;i++) { if(min>num[i]) min = num[i]; } return min; } void judge(int Arr[Length]) { int i,j = 0; int flag1,flag2,flag3; //用来表示水桶 int count[3] = {0,0,0}; //用来计录当前水王数目 flag1 = -1; //初始化水桶 flag2 = -1; flag3 = -1; while((flag1==-1)||(flag2==-1)||(flag3==-1)) //while循环做的是将ID表中不相等的最前的三个找出并作为水桶 { if((flag1 == Arr[j])||(flag1 == -1)) { flag1 = Arr[j]; count[0]++; } else if((flag2 == Arr[j])||(flag2 == -1)) //将水桶与ID表中的数赋值 { flag2 = Arr[j]; count[1]++; } else if((flag3 == Arr[j])||(flag3 == -1)) { flag3 = Arr[j]; count[2]++; } j++; //用来计数,记录当前ID表中已经遍历的ID数目 } for(i=j;i<Length;i++) //运用“消消乐”的方法,将ID表中的水桶找出 { if(flag1 == Arr[i]) //当当前ID与已知的水桶相等时 { flag1 = Arr[i]; count[0]++; } else if(flag2 == Arr[i]) { flag2 = Arr[i]; count[1]++; } else if(flag3 == Arr[i]) { flag3 = Arr[i]; count[2]++; } else //d当当前的ID与已知水桶的三个ID都不相等时 { if(count[0] == MIN(count)) //找出最小的count,减1 { count[0]--; if(count[0]<1) { flag1 = Arr[i+1]; count[0] = 1; i++; } } else if(count[1] == MIN(count)) { count[1]--; if(count[1]<1) { flag2 = Arr[i+1]; count[1] = 1; i++; } } else if(count[2] == MIN(count)) { count[2]--; if(count[2]<1) { flag3 = Arr[i+1]; count[2] = 1; i++; } } } } printf("水桶的ID是:%d %d %d\n",flag1,flag2,flag3); //输出结果 } int main(int argc, char* argv[]) { int Array[Length] = {1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4}; printf("ID表中的内容是:\n"); for(int i=0;i<Length;i++) { printf("%d ",Array[i]); } printf("\n\n"); judge(Array); return 0; }
四、运行截图
五、总结
这次的课堂作业和上次的几乎一样,最起码在代码实现的思想上是一样的,但是,我觉得在一些小细节方面还是有所不同的。
比如:在对水桶flag1,flag2,flag3赋值时,如果采用flag1 = Arr[0],flag2 = Arr[1],...时,显然是不合适的,因为前几个ID
有可能一样,因此,在代码实现的过程中,我运用了while语句(具体实现方法请看代码),对ID表中最前面不一样的三个赋值,且
对计数器count[i]进行++,
这样就能解决问题了。