描述
请实现一个计票统计系统。你会收到很多投票,其中有合法的也有不合法的,请统计每个候选人得票的数量以及不合法的票数。
(注:不合法的投票指的是投票的名字不存在n个候选人的名字中!!)
数据范围:每组输入中候选人数量满足 1 \le n \le 100 \1≤n≤100 ,总票数量满足 1 \le n \le 100 \1≤n≤100
输入描述:
第一行输入候选人的人数n,第二行输入n个候选人的名字(均为大写字母的字符串),第三行输入投票人的人数,第四行输入投票。
输出描述:
按照输入的顺序,每行输出候选人的名字和得票数量(以" : "隔开,注:英文冒号左右两边都有一个空格!),最后一行输出不合法的票数,格式为"Invalid : "+不合法的票数。
示例1
输入:
4 A B C D 8 A D E CF A GG A B
复制输出:
A : 3 B : 1 C : 0 D : 1 Invalid : 3
复制说明:
E CF GG三张票是无效的,所以Invalid的数量是3.
题解:map会导致最终输出的顺序和开始插入的顺序不一致,使用unordered_map同样存在相似的问题,这里使用vector将最终的顺序保存下,最终输出的时候根据vector的顺序输出,就能保证和题目要求的顺序一致。
#include <iostream>
#include <string.h>
#include <vector>
#include <map>
void VoteCount(std::vector<std::string> nameVect, std::vector<std::string> voteVect)
{
//nameVect保存最原始的用户名
std::map<std::string, int> rtnMap; //key表示候选人姓名,value表示候选人得票数
std::vector<std::string>::iterator itername = nameVect.begin();
while (itername != nameVect.end())
{
// std::cout << "itername = " << *itername << std::endl;
rtnMap.insert(std::pair<std::string,int>(*itername, 0));
itername++;
}
int Invalid = 0;
std::vector<std::string>::iterator iterVote= voteVect.begin();
while (iterVote != voteVect.end())
{
std::string name = *iterVote;
std::size_t size = rtnMap.count(name);
if(size != 0)
{
std::map<std::string, int>::iterator iterMap = rtnMap.find(name);
std::string key = iterMap->first;
int value = iterMap->second;
rtnMap[name] = ++value;
// rtnMap.insert(std::pair<std::string,int>(key, ++value));
}
else
{
Invalid ++;
}
iterVote++;
}
int i = 0;
for(int i = 0; i < nameVect.size(); ++i)
{
std::string name = nameVect.at(i);
std::map<std::string, int>::iterator iter = rtnMap.find(name);
std::cout << iter->first << " : " << iter->second << std::endl;
}
std::cout << "Invalid : " << Invalid << std::endl;
}
int main()
{
int n;
std::cin >> n;
std::vector<std::string> nameVect;
while(n--)
{
std::string name;
std::cin >> name;
nameVect.push_back(name);
}
int people;
std::cin >> people;
std::vector<std::string> voteVect;
while(people--)
{
std::string vote;
std::cin >> vote;
voteVect.push_back(vote);
}
VoteCount(nameVect, voteVect);
return 0;
}