网易2017笔试题-日记的颜色

题目描述

最近面试做了一个笔试题,感觉还挺有收获的。

Markdown

输入输出样例

输入例子:
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值