题目描述
最近面试做了一个笔试题,感觉还挺有收获的。
输入输出样例
输入例子:
2
<diary><color=red>I am happy.<color=blue>I am sad.</color>I am happy.</color>This is black.</diary>
<diary><color=ab>12</color><color=a>12</color><color=aa>12</color></diary>
输出例子:
Case 1
red: 18
black: 12
blue: 7
Case 2
a: 2
aa: 2
ab: 2
源码
#include <iostream>
#include <vector>
#include<map>
#include <algorithm>
typedef pair<string, int> PAIR;
using namespace std;
int cmp(const PAIR &x, const PAIR &y) {
return x.second > y.second;
}
int foo(string ss){
int num=0;
for(int i=0;i<ss.length();i++){
if(ss[i]!='\t'&&ss[i]!=' ')
num++;
}
return num;
}
int main(){
string ns;
getline(cin,ns);//读取含有空格的字符串用getline
int n=stoi(ns);
for(int i=0;i<n;i++){
string ss;
getline(cin,ss);
ss=ss.substr(ss.find("<diary>")+7);//找出字符串的区间
ss=ss.substr(0,ss.find("</diary>"));
vector<string> colorStack;//利用Stack存储和获得当前颜色
//核心的思想就是遇到<color>标签入栈颜色,遇到</color>标签出栈颜色,这样解决嵌套问题
map<string,int> cnt;//记录最终的结果
colorStack.push_back("black");//默认颜色black
string subStr,color;
for(int idx=0,temp1,temp2,temp3,num;idx<ss.length();){
//遇到字符串
if(ss[idx]!='<'){
temp1=ss.find("<",idx);
if(int(temp1)==-1) temp1=ss.length();//找不到'<'
subStr=ss.substr(idx,temp1-idx);
color=colorStack.back();
num=foo(subStr);
cnt[color]+=num;
idx=temp1;
}
//遇到标签
else{
//<color标签>
if(ss[idx+1]=='c'){
temp1=ss.find("=",idx);
temp2=ss.find(">",idx);
color=ss.substr(temp1+1,temp2-temp1-1);
colorStack.push_back(color);
idx=temp2+1;
}
//</color标签>
else if(ss[idx+1]=='/'){
colorStack.pop_back();
idx+=8;
}
}
}
//由于题目要求对输出结果进行处理,排序的优先级为:1.出现的字符数;2.颜色名称的字典序,而map这种数据类型不能运用到stable_sort里面,所以要把map数据处理成vector<PAIR>数据
cout<<"Case "<<i+1<<endl;
map<string,int> ::iterator it;
// for(it=cnt.begin();it!=cnt.end();it++){
// cout<<it->first<<": "<<it->second<<endl;
// }
vector <PAIR> pair_vec;
for (auto it = cnt.begin(); it != cnt.end(); it++){
pair_vec.push_back(make_pair(it->first, it->second));
}
stable_sort(pair_vec.begin(), pair_vec.end(), cmp);
for (auto curr = pair_vec.begin(); curr != pair_vec.end(); ++curr) {
cout << curr->first <<": "<<curr->second<< endl;
}
}
return 0;
}