编程之美 -- 寻找发帖水王,以及扩展题

题目:编程之美

Tango是微软亚洲研究院的一个试验项目,如图1所示。研究院的员工和实习生们都
很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊
间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中
帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?

包含扩展题,3个发帖多的超过1/4的,另一个为发帖刚好为一半的情况。

代码如下:

#include 
#include 
using namespace std;

unsigned int find_id(unsigned int *array,unsigned int n);
unsigned int find_half_id(unsigned int *array,unsigned int n);
void find_3_more(unsigned int *array,unsigned int n,unsigned int *sel);

int main()
{
	unsigned int a[7] = {1,2,1,1,0,1,3};
	 
	cout<< find_id(a,7)<= n/2 ? array[n-1] : find_id(array,n-1);

}

//3个发帖多ID,每个超过1/4. 与查找一半以上的水王极为类似!!
void find_3_more(unsigned int *array,unsigned int n,unsigned int *sel)
{
	unsigned int count[3] ;
	memset(sel,0,sizeof(unsigned int)*3);
	memset(count,0,sizeof(unsigned int)*3);
	for(unsigned int i = 0;i < n;i++)
	{
		if (count[0] == 0)//3个某个候选为0则给予候选码,继续
		{
			count[0] = 1;
			sel[0] = array[i];
		}
		else if (count[1] == 0)
		{
			count[1] = 1;
			sel[1] = array[i];
		}
		else if (count[2] == 0)
		{
			count[2] = 1;
			sel[2] = array[i];
		}
		else
		{
			if (sel[0] == array[i])//与某个候选相同
			{
				count[0]++;
			}
			else if (sel[1] == array[i])
			{
				count[1]++;
			}
			else if (sel[2] == array[i])
			{
				count[2]++;
			}
			else //没有没3个候选中的一个,都减
			{
				count[0]--;
				count[1]--;
				count[2]--;
			}

		}

	}
}


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