解题思路:创建一个拥有String和int类型的结构体(node)存储其单词和出现的次数,用istringstream将句子按空格分割化成单词存储在vector
#include<bits/stdc++.h>
using namespace std;
/*用vector模拟unordered_map*/
struct Node {
string str;
int time=1;
Node(string s) {//构造函数
str = s;
};
};
int main()
{
vector<Node>vec;
string str;
getline(cin, str);
istringstream is(str);//用istringstream讲句子按找空格变为一个个单词
string s;
int flag = 0;//标记是否已经存在在vector中的单词
int i = 0;
int max_len = 0;//最长长度,输出时让单词都在一边
while (is >> s)
{
if (s.find('.') != -1)s.erase(s.find('.'), 1);
else if (s.find(',') != -1)s.erase(s.find(','), 1);
transform(s.begin(), s.end(), s.begin(), ::toupper);//这三句将单词变为大写并去掉标点符号
if (s.length() > max_len)max_len = s.length();//找到最长的单词长度
Node *n = new Node(s);
for (i=0;i<vec.size();i++)
{
if (n->str == vec[i].str) {
flag = 1; break;//找到相同节点的下标,所以break
}
}
if (flag == 0)
vec.push_back(*n);//将单词放入vec,vector中没有相同时假如一个单词,有的时候使node的time+1
else { vec[i].time++; flag = 0; }
}
for (i=0;i<vec.size();i++)//按格式输出
{
cout << setw(max_len) << vec[i].str << ":";
for (int j = 0; j <vec[i].time; j++)
{
cout << '*';
}
cout <<vec[i].time << endl;
}
return 0;
}
解题思路2:利用unodered_map及vector容器,这次写了split函数用来拆分句子并直接放入vector
#include <bits/stdc++.h>
#include <vector>
#include <iostream>
#include <unordered_map>
#pragma comment(linker,"/STACK:10240000,10240000") //手动加栈
using namespace std;
vector<string> split(const string& str, const string& delim) { //将分割后的子字符串存储在vector中
vector<string> res;
if ("" == str) return res;
string strs = str + delim; //*****扩展字符串以方便检索最后一个分隔出的字符串
size_t pos;
size_t size = strs.size();
for (int i = 0; i < size; ++i) {
pos = strs.find(delim, i); //pos为分隔符第一次出现的位置,从i到pos之前的字符串是分隔出来的字符串
if (pos < size) { //如果查找到,如果没有查找到分隔符,pos为string::npos
string s = strs.substr(i, pos - i);//*****从i开始长度为pos-i的子字符串
if(!s.empty())
res.push_back(s);//两个连续空格之间切割出的字符串为空字符串,这里没有判断s是否为空,所以最后的结果中有空字符的输出,
i = pos + delim.size() - 1;
}
}
return res;
}
int main()
{
unordered_map<string, int> m;//定义unordered_map
string str; int n;
string s;
getline(cin, s);
std::vector<string> sa=split(s," ");//将s拆分
int max_len = 0;//获取最长长度,输出要用
for (vector<string>::iterator iter = sa.begin(); iter != sa.end(); iter++)
{
if (iter->find('.') != -1)iter->erase(iter->find('.'), 1);
else if (iter->find(',') != -1)iter->erase(iter->find(','), 1);
string t = *iter;//map中的string键值
transform(t.begin(), t.end(), t.begin(), ::toupper);
/*cout << *iter<<endl;*/
m[t]++;//每次出现让其int类型的数据+1
if (t.length() > max_len)max_len = t.length();
}
for (unordered_map<string, int>::iterator it = m.begin(); it != m.end(); it++)
{
//按题目要求格式输出
cout <<setw(max_len)<< it->first << ":";
for (int i = 0; i < it->second; i++)
{
cout << '*';
}
cout <<it->second<< endl;
}
return 0;
}
第一次冲进全站前十,加油!!!
最后一次更新于2021-02-25
0 条评论