编程之美2.3寻找发帖水王和扩展问题

来源:互联网 发布:麟龙炒股软件 编辑:程序博客网 时间:2024/06/05 08:16

推荐http://blog.csdn.net/zhanglei0107/article/details/8230472

#include <iostream>#include <string>using namespace std;void fun(){int arr[] = {2,4,7,1,1,3,1,5,1,2,1,1,3,1,1};int len = 15;int candi = arr[0];//设定水王候选人是下标为0的编号int count = 1;//次数为1for(int i=1;i<len;i++){if(arr[i]==candi)//如果和候选一致,那么自动加1count++;else{count--;//if(count<0){candi = arr[i];//将当前编号赋值给候选人}}}cout<<"水王编号为:"<<candi<<endl;}int main(){fun();return 0;}
输出1
2、扩展问题

有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目的1/4,你能从发帖ID列表中快速找到吗?

与之前同意的思路,只不过现在需设置3个candidate变量。若与此3个candidate的id均不相同,则count-1。

#include <iostream>#include <string>using namespace std;//fun和fun1实现效果一样//思路比较紧凑,但比较晦涩void fun(){int arr[] = {1,2,5,3,2,1,6,3,1,3,2,8,1,2,3};int len = 15;int candi[3];//设定水王候选人int count[3];//次数count[0] = 0;count[1] = 0;count[2] = 0;int flag = 0;bool outsite = false;//跳转到外层循环标志for(int i=0;i<len;i++){for(int j=0;j<3;j++){if(flag==j){candi[j]=arr[i];flag=j+1;count[j]++;outsite = true;break;}if(candi[j]==arr[i]){count[j]++;outsite = true;break;}}if(outsite){outsite = false;//重置为falsecontinue;}count[0]--;count[1]--;count[2]--;for(int i=0;i<3;i++){if(count[i]<0){candi[i]=arr[i];flag=i;}}}cout<<"水王编号为:"<<candi[0]<<","<<candi[1]<<","<<candi[2]<<endl;}//思路比较清晰,比较多void fun1(){int arr[] = {1,2,5,3,2,1,6,3,1,3,2,8,1,2,3};int len = 15;int candi[3];//设定水王候选人int count[3];//次数count[0] = 0;count[1] = 0;count[2] = 0;int flag = 0;for(int i=0;i<len;i++){if(flag==0){candi[0]=arr[i];flag=1;count[0]++;continue;}if(candi[0]==arr[i]){count[0]++;continue;}if(flag==1){candi[1]=arr[i];flag=2;count[1]++;continue;}if(candi[1]==arr[i]){count[1]++;continue;}if(flag==2){candi[2]=arr[i];flag=3;count[2]++;continue;}if(candi[2]==arr[i]){count[2]++;continue;}count[0]--;count[1]--;count[2]--;for(int i=0;i<3;i++){if(count[i]<0){candi[i]=arr[i];flag=i;}}}cout<<"水王编号为:"<<candi[0]<<","<<candi[1]<<","<<candi[2]<<endl;}int main(){fun();return 0;}
输出1,2,3