推荐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;//次数为1
for(int i=1;i<len;i++){
if(arr[i]==candi)//如果和候选一致,那么自动加1
count++;
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;//重置为false
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;
}
//思路比较清晰,比较多
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