// 编程之美 寻找发帖水王.cpp : 定义控制台应用程序的入口点。
//有一个水王发帖超过一半 给你发帖所有的id 找到他
//统计每个id出现次数 找到最大的(超过一半)
//有一个水王发帖超过一半 给你发帖所有的id 找到他
//统计每个id出现次数 找到最大的(超过一半)
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class ID
{
public:
int nTimes;
string id;
ID();
};
ID::ID()
{
nTimes = 0;
}
void input(vector<string> &v, int n)
{
string s;
cout << "输入id号" << endl;
for (int i = 0; i < n; i++)
{
cin >> s;
v.push_back(s);
}
}
string Find(const vector<string> &v, ID id[], const int n)
{
bool flag;//用于判断数组中是否出现了id列表中的id
int i;
ID candidate;
for (auto data : v)
{
flag = false;
for (i = 0; i < n; i++)
{
if (!id[i].id.empty()) //字符串不空
{
if (data == id[i].id)
{
id[i].nTimes++;
flag = true;
}
}
else //到字符串是空的了(到头了)
{
if (!flag)
{
id[i].id = data;//新字符串放进去
id[i].nTimes++;
}
break;
}
}
}
candidate = id[0];
for (i = 0; i < n; i++)
{
if (id[i].nTimes > candidate.nTimes)
{
candidate = id[i];
}
}
//每个id和他的次数
for (i = 0; i < n; i++)
{
if (!id[i].id.empty())
{
cout << "id:" << id[i].id << " num:" << id[i].nTimes << endl;
}
}
return candidate.id;
}
string Find(const vector<string> &v, const int n) //书中方法 函数冲在
{
string candidate;//水王
int ntime=0, i;
for (i = 0; i < n; i++)
{
if (ntime == 0) //ntime=0,前面的id全部忽略
{
candidate = v[i],ntime=1;
}
else
{
if (candidate == v[i])
{
ntime++;//两个重复的 出现次数++
}
else
{
ntime--;//出现不一样的id当前水王出现次数--
}
}
cout << candidate << endl;
}
cout <<candidate<< endl;
return candidate;
}
int main()
{
vector<string> v;
int n;//列表中的id个数
cout << "please input id's number" << endl;
cin >> n;
input(v, n);
ID *id = new ID[n];
//Find(v, id, n);
cout << "书中方法"<< endl;
Find(v,n);
delete[]id;
id = NULL;
system("pause");
return 0;
}