ccf题库20170903--Json查询

题目如下:

试题编号:    201709-3
试题名称:    JSON查询
时间限制:    1.0s
内存限制:    256.0MB
问题描述:
问题描述
  JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,可以用来描述半结构化的数据。JSON 格式中的基本单元是值 (value),出于简化的目的本题只涉及 2 种类型的值:
  * 字符串 (string):字符串是由双引号 " 括起来的一组字符(可以为空)。如果字符串的内容中出现双引号 ",在双引号前面加反斜杠,也就是用 \" 表示;如果出现反斜杠 \,则用两个反斜杠 \\ 表示。反斜杠后面不能出现 " 和 \ 以外的字符。例如:""、"hello"、"\"\\"。
  * 对象 (object):对象是一组键值对的无序集合(可以为空)。键值对表示对象的属性,键是属性名,值是属性的内容。对象以左花括号 { 开始,右花括号 } 结束,键值对之间以逗号 , 分隔。一个键值对的键和值之间以冒号 : 分隔。键必须是字符串,同一个对象所有键值对的键必须两两都不相同;值可以是字符串,也可以是另一个对象。例如:{}、{"foo": "bar"}、{"Mon": "weekday", "Tue": "weekday", "Sun": "weekend"}。
  除了字符串内部的位置,其他位置都可以插入一个或多个空格使得 JSON 的呈现更加美观,也可以在一些地方换行,不会影响所表示的数据内容。例如,上面举例的最后一个 JSON 数据也可以写成如下形式。
  {
  "Mon": "weekday",
  "Tue": "weekday",
  "Sun": "weekend"
  }
  给出一个 JSON 格式描述的数据,以及若干查询,编程返回这些查询的结果。
输入格式
  第一行是两个正整数 n 和 m,分别表示 JSON 数据的行数和查询的个数。
  接下来 n 行,描述一个 JSON 数据,保证输入是一个合法的 JSON 对象。
  接下来 m 行,每行描述一个查询。给出要查询的属性名,要求返回对应属性的内容。需要支持多层查询,各层的属性名之间用小数点 . 连接。保证查询的格式都是合法的。
输出格式
  对于输入的每一个查询,按顺序输出查询结果,每个结果占一行。
  如果查询结果是一个字符串,则输出 STRING <string>,其中 <string> 是字符串的值,中间用一个空格分隔。
  如果查询结果是一个对象,则输出 OBJECT,不需要输出对象的内容。
  如果查询结果不存在,则输出 NOTEXIST。
样例输入
10 5
{
"firstName": "John",
"lastName": "Smith",
"address": {
"streetAddress": "2ndStreet",
"city": "NewYork",
"state": "NY"
},
"esc\\aped": "\"hello\""
}
firstName
address
address.city
address.postal
esc\aped
样例输出
STRING John
OBJECT
STRING NewYork
NOTEXIST
STRING "hello"
评测用例规模与约定
  n ≤ 100,每行不超过 80 个字符。
  m ≤ 100,每个查询的长度不超过 80 个字符。
  字符串中的字符均为 ASCII 码 33-126 的可打印字符,不会出现空格。所有字符串都不是空串。
  所有作为键的字符串不会包含小数点 .。查询时键的大小写敏感。
  50%的评测用例输入的对象只有 1 层结构,80%的评测用例输入的对象结构层数不超过 2 层。举例来说,{"a": "b"} 是一层结构的对象,{"a": {"b": "c"}} 是二层结构的对象,以此类推。

这题我刚开始被示例给迷惑了,是将key和value分开输入的,类似于cin>>key>>value,这里应该是要讲每行字符串连接成一个新的字符串,然后遍历整个字符串,遇到:表示key录入完毕,遇到,和},要先判断,的情况,确定,前面没有},这是才表示value录入完毕。再就是前缀的问题,出现{时先判断key是否为空,为空的话,那就前缀preHost不变,如果不为空,且要判断preHost原来是否为空,如果是空的,那么preHost=key,否则,preHost=preHost+"."+key。代码如下

#include<stdio.h>#include<iostream>
#include<map>
#include<string.h>
using namespace std;
int main()
{
    string s="";
    int n,m;
    cin>>n>>m;
    getchar();
    for(int i=0;i<n;i++)
    {
        string temps;
        getline(cin,temps);
        s+=temps;
    }
    map<string,string> json;
    string key="",value="";
    string kvs="";
    int count=0,vflag=0,kflag=0;
//    cout<<s<<" len:"<<s.length()<<endl;
    string preHost="";
    int len=s.length();
    for(int i=0;i<len;i++)
    {
        if(s[i]!=‘\"‘&&s[i]!=‘\\‘&&s[i]!=‘ ‘)
        {
            if(s[i]==‘:‘||s[i]==‘,‘||s[i]==‘}‘)
            {
                if(s[i]==‘,‘||s[i]==‘}‘)
                {
                    if(s[i]==‘,‘&&s[i-1]==‘}‘)
                    {
                        preHost="";
                    }else{
                    //    cout<<"flag :"<<s[i]<<endl;
                        kvs[count]=‘\0‘;
                        value=kvs;
                        vflag=1;
                        kvs="";
                        count=0;
                    }
                }else{
                    kvs[count]=‘\0‘;
                //    cout<<"kvs:"<<kvs<<endl;
                    key=kvs;
                //    cout<<"key:"<<key<<endl;
                    kvs="";
                    kflag=1;
                    count=0;
                }
            }else{
                if(s[i]!=‘{‘)
                {
                    kvs+=s[i];
                    count++;
                }else if(s[i]==‘{‘){
                    if(key!="")
                    {
                        value="{";
                        vflag=2;
                        if(preHost=="")
                        {
                            preHost=key;
                        }else{
                            preHost=preHost+"."+key;
                        }
                    }
                }
            }
        }else if(s[i]==‘\\‘)
        {
            i++;
        //    cout<<"vflag:"<<vflag<<" kflag:"<<kflag<<endl;
            kvs+=s[i];
            count++;
        }
        if(kflag==1&&vflag>=1)
        {
        //    cout<<"preHost:"<<preHost<<endl;
            if(vflag==1)
            {
                if(preHost!="")
                    key=preHost+"."+key;
            }
            else if(vflag==2)
            {
                key=preHost;
            }
        //    cout<<"key:"<<key<<"  value:"<<value<<endl;
            json[key]=value;
            vflag=0;
            kflag=0;
            key="";
            value="";
            if(s[i]==‘}‘)
            {
                preHost="";
            }
        }
    }

    for(int i=0;i<m;i++)
    {
        string temps;
        cin>>temps;
        if(json[temps]=="")
        {
            cout<<"NOTEXIST"<<endl;
        }else if(json[temps]=="{")
        {
            cout<<"OBJECT"<<endl;
        }else{
            cout<<"STRING "<<json[temps]<<endl;
        }
    }
    return 0;
}

补充知识:如何遍历map:

    map<string, string>::const_iterator it;
    for (it = json.begin(); it != json.end(); ++it)
        cout << it->first << "=" << it->second << endl; 
时间: 2024-10-12 22:44:28

ccf题库20170903--Json查询的相关文章

ccf 201709-3 JSON查询

ccf 201709-3 JSON查询  解题思路: 首先,先逐行读入n行数据,因为数据中会经常出现 空格 或者是 换行,所以,我们遇到空格和换行就忽略,同时将转义字符进行处理,将n行数据存入一个一维数组中.由于"n ≤ 100,每行不超过 80 个字符.m ≤ 100,每个查询的长度不超过 80 个字符",所以我们可以将一位数组的大小设置为100*80,我偷了个懒直接设置了一维数组 in[maxn * maxn]. 接着需要构造一个映射,即做一个 string->string

CCF-CSP刷题库11-18

CCF-CSP刷题库11-18 第十一次认证 201709-1 打酱油 201709-2 公共钥匙盒 201709-3 JSON查询 201709-4 通信网络 第十二次认证 201712-1 最小差值 201712-2 游戏 201712-3 Crontab 201712-4 行车路线 第十三次认证 201803-1 跳一跳 201803-2 碰撞的小球 201803-3 URL映射 201803-4 棋局评估 第十四次认证 201809-1 卖菜 201809-2 买菜 201809-3 元

使用QtScript库解析Json数组例子

本文转载自:http://blog.sina.com.cn/s/blog_671732440100uwxh.html 使用qtscipt库解析json数组首先在工程文件中加 QT        += script 然后头文件加 #include <QtScript> 然后解析 QString str = "{\"name\":\"xiaotang\", \"age\":\"23\", \"chi

051 题库

序号 OCP 051题库 1 :  OCP-1Z0-051 第1题 CTAS语句建表注意事项 2 :  OCP-1Z0-051 第2题 视图的WITH CHECK OPTION选项 3 :  OCP-1Z0-051 第3题 转义字符 4 :  OCP-1Z0-051 第4题 单行函数 5 :  OCP-1Z0-051 第5题 to_char的数字的格式 6 :  OCP-1Z0-051 第6题 case when和decode的用法 7 :  OCP-1Z0-051 第7题 ON和USING子句

高校平台之题型题库——不再“死”不再动态

高校平台集考试系统.权限系统.基础系统.评教系统.新生入学系统等,有幸参加其中之一的考试系统.在考试系统中存在这样一种情况,关于题库表怎么在数据库中存放的问题. 题库看着简单的两个字,却包含了很多,题库中包含很多题型,每个题型有很多题,就廊坊师范学院来说,到现在为止,经历过得题型就有28种,而且每年都有可能会新增很多题型,如果单纯只是将题型列举,怎么也列举不完,每个题型中有多少道题也不确定,也许今年多,明年就少,也许今年少,明年多... 那么应该如何解决这个问题?有以下三种解决方案: 第一:动态

题库——

本篇随便主要是提供java题库,方便于日后快速查询: 着重提供思路和代码,力求简洁,而且给出分析,和结果. \ IO流实列: 缓冲流键盘输入,与输出 1 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); 2 3 BufferedWriter bufw=new BufferedWriter(new FileWriter("D:\\fd")); 4 BufferedWriter bw=new

OCP读书笔记(21) - 题库(ExamA)

3.Your database is in ARCHIVELOG mode. You have two online redo log groups, each of which contains one redo member. When you attempt to start the database, you receive the following errors: ORA-00313: open failed for members of log group 1 of thread

尔雅通识题库系统

尔雅通识课 尔雅通识课题库 尔雅通识课作业 尔雅通识课答案 尔雅通识课题库系统 登录账户和密码即可查询课程题目的答案 登录入口 点击打开链接 http://erya.chinacloudsites.cn *注意使用必须尔雅课的账户密码登录 如下课程的题库 数据库中课程数目高达 100课! 题库数量超过10万题 后期会逐渐添加其他课程 敬请期待!

我是如何用单机实现亿级规模题库去重的?

背景 最近工作中遇到了一个问题:如何对大规模题库去重?公司经过多年的积累,有着近亿道题目的题库,但是由于题目来源不一导致题库中有很多重复的题目,这些重复的题目在检索时,除了增加搜索引擎的计算量外,并不会提高准确率.此外由于题目过多,搜索引擎往往采取了截断策略,只对一部分题目进行计算,这导致了某些正确的题目反而得不到计算,拍搜准确率甚至不增反降.所以对于一个搜索引擎来说,虽然初期增加题目数量往往可以大幅提高拍搜准确率,但是当题目量大到一定程度时,反而会由于计算量跟不上导致准确率下降.如何尽可能的去