题解 | #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
首先处理输入的字符串,形成只有16位以下的文件名,和行数组成字符串,利用vector形成原来的排序,映射累计出现的次数,再用两次反迭代,输出只含有最后8条记录
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
using namespace std;
int main() {
string str;
unordered_map <string, int> m1;
vector <string> v1, v2;
int space_pos, row;
while (cin >> str && cin >> row) {
//提取最后一个转义符后面的字符串
for (int i = str.length() - 1; i >= 0; --i) {
if (str[i] == '\\') {
space_pos = i;
break;
}
}
str = str.substr(space_pos + 1, str.length() - space_pos - 1);
//大于16则取16位
str = str.length() > 16 ? str.substr(str.length() - 16, 16) : str;
str += ' ' ;
str += to_string(row);
//利用vector排序,映射来计数
if ( m1.find(str) == m1.end()) {
m1[str] = 1;
v1.push_back(str);
} else
m1[str] ++ ;
}
int count = 0;
//提取后8条错误记录
for (vector<string>::reverse_iterator it = v1.rbegin(); it != v1.rend();
it++) {
++count;
v2.push_back(*it);
//如果体积大于8
if (count == 8 && v1.size() > 8)
break;
}
//在另一个vector中输出键,m1中的映射输出值
for (vector<string>::reverse_iterator it = v2.rbegin(); it != v2.rend();
it++) {
cout << *it << " " << m1[*it] << endl;
}
}