水骑士设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?(参考核心代码)
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
编程思路:
1.定义三个变量分别对三个不同的id计数,并定义一个有三个元素中间数组保存这三个id,三个变量分别对应,数组的三个id
2.若三个变量有一个为0,且,当前id为在中间数组中,则将当前id保存到该变量对应的中间数组的位置
3.如果中间数组没有任一一个元素为空,且不属于该数组中的任一id,则将三个变量各减一
4.重复上述步骤,直至读取id结束
源代码:
#include<iostream>
#include <fstream>
#include <string>
using namespace std;
char ID[1000][20];//保存从文件读到的id
int i;//记录id总个数
void input()//从文件读取数据
{
string mid_path;//文件路径
i=0;//初始化i
cout<<"请输入文件路径:"<<endl;
cin>>mid_path;
char path[20];//将文件路径转换为字符数组形式,保存到该数组。
ifstream infile;//定义文件读入类型
//判断路径是否正确,不正确则重新输入
do
{
strcpy(path,mid_path.c_str());//将字符串转换为字符数组
infile.open(path);//打开指定文件
//infile.open("G:\\text.txt");
if (!infile)//判断是否已打开
{
cout<<"打开文件错误,请重新输入文件路径:"<<endl;
cin>>mid_path;
}
} while (!infile);
while (!infile.eof())//读取文件,知道结束
{
infile>>ID[i];
i++;
}
infile.close();//关闭文件
}
void find()//找水王
{
i--;//排除最后一个空字符串
string king_id[3]={"0","0","0"};//临时保存某一id
string mid_str;//char转换为string
int id_first=0;
int id_second=0;
int id_third=0;
for (int j=0;j<i;j++)
{
mid_str=ID[j];
//若是相同的id,则计数加一
if (king_id[0]==mid_str)
{
id_first++;
}
else if (king_id[1]==mid_str)
{
id_second++;
}
else if (king_id[2]==mid_str)
{
id_third++;
}
//若king_id数组某一位为空,则将当前id保存到空king_id数组该位中
else if (id_first==0)
{
king_id[0]=mid_str;
id_first++;
}
else if (id_second==0)
{
king_id[1]=mid_str;
id_second++;
}
else if (id_third==0)
{
king_id[2]=mid_str;
id_third++;
}
//若当前king_id数组不为空,则计数减一,相当于消除四个完全不同的id
else
{
id_first--;
id_second--;
id_third--;
}
}
cout<<"三个小水王ID为:"<<endl;
cout<<king_id[0]<<endl<<king_id[1]<<endl<<king_id[2]<<endl;
}
int main()
{
input();
find();
return 0;
}
截图:


浙公网安备 33010602011771号