编程之美: 第二章 数字之魅 2.3_1寻找发帖超过总帖1/4的水王

/*
有3个发帖很多的ID,他们发帖数目都超过了帖子总数目N的1/4,你能从ID列表中找出它们的ID吗?
先考虑2个发帖很多的ID,他们发帖数目超过帖子总数目的1/3,每次删除三个不一样的便可

输入:(针对2两个水王)
9
1 2 3 2 3 2 3 2 3
输出:
2 3

输入:(针对3个水王)
16
1 2 3 4 2 3 4 2 3 4 2 3 4 2 3 4

输出:
2 3 4
*/

/*
关键:
1 		if(iRet1 == pArr[i])//如果当前是水王,则次数累加;如果次数为0,重新赋值次数,如果不是,全部次数减1
		{
			iTimes1++;
		}
2 		else if(iTimes1 == 0)//如果次数为0,重新赋值次数
		{
			iTimes1 = 1;
			iRet1 = pArr[i];
3 		else
		{
			iTimes1--;
			iTimes2--;
			iTimes3--;
*/
#include 

const int MAXSIZE = 10000;
const int INF = 1000000000;

void thirdTimesNum(int* pArr,int iLen)
{
	int iRet1 = INF,iRet2 = INF;
	int iTimes1 = 0,iTimes2 = 0;
	for(int i = 0 ; i < iLen ; i++)
	{
		if(iTimes1 == 0)
		{
			if(iRet2 == pArr[i])//这个绝对有问题
			{
				iTimes2++;
			}
			else
			{
				iRet1 = pArr[i];
				iTimes1++;
			}
		}
		else if(iTimes2 == 0)
		{
			if(iRet1 == pArr[i])
			{
				iTimes1++;
			}
			else
			{
				iRet2 = pArr[i];
				iTimes2++;
			}
		}
		else
		{
			if(iRet1 == pArr[i])
			{
				iTimes1++;
			}
			else if(iRet2 == pArr[i])
			{
				iTimes2++;
			}
			else
			{
				iTimes1--;
				iTimes2--;
			}
		}
	}
	printf("%d %d\n",iRet1,iRet2);
}

void forthTimesNum(int* pArr,int iLen)
{
	int iRet1 = INF,iRet2 = INF,iRet3 = INF;
	int iTimes1,iTimes2,iTimes3;
	iTimes1 = iTimes2 = iTimes3 = 0;
	for(int i = 0 ; i < iLen ; i++)
	{
		if(iRet1 == pArr[i])//如果当前是水王,则次数累加;如果次数为0,重新赋值次数,如果不是,全部次数减1
		{
			iTimes1++;
		}
		else if(iRet2 == pArr[i])
		{
			iTimes2++;
		}
		else if(iRet3 == pArr[i])
		{
			iTimes3++;
		}
		else if(iTimes1 == 0)//如果次数为0,重新赋值次数
		{
			iTimes1 = 1;
			iRet1 = pArr[i];
		}
		else if(iTimes2 == 0)
		{
			iTimes2 = 1;
			iRet2 = pArr[i];
		}
		else if(iTimes3 == 0)
		{
			iTimes3 = 1;
			iRet3 = pArr[i];
		}
		else
		{
			iTimes1--;
			iTimes2--;
			iTimes3--;
		}
	}
	printf("%d %d %d\n",iRet1,iRet2,iRet3);
}


void process()
{
	int n;
	while(EOF != scanf("%d",&n))
	{
		int iArr[MAXSIZE];
		for(int i = 0 ; i < n ; i++)
		{
			scanf("%d",&iArr[i]);
		}
		//thirdTimesNum(iArr,n);
		forthTimesNum(iArr,n);
	}
}




int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}

你可能感兴趣的:(编程之美)