CCF 201709-3 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"}} 是二层结构的对象,以此类推。

算法设计

引自这里

先将整个JSON文本存储到一个字符串s中,然后利用正则表达式将其格式化。正则表达式的语法这里不详细展开,读者可以查阅相关文档。格式化的步骤为:

  1. 去掉s中所有的空格字符
  2. 将两个连续的\"字符转换为单个"字符
  3. 将两个连续的\\字符转换为单个\字符
  4. 在每个,字符后添加一个空格字符
  5. 在每个:字符后添加一个空格字符
  6. 在每个{字符左右均添加空格字符
  7. 在每个}字符左右均添加空格字符

注意2、3步顺序不能颠倒,具体原因读者可以尝试自己思考一下。
然后将整个格式化后的s字符串读入一个stringstream变量中,那么整个字符串s在stringstream中就会自动按空格键分割成多个字符串。然后逐个从该变量中读取字符串,通过深度优先搜索函数递归处理,将键和对应的值存储到unordered_map<string,string>ans中。要注意形如"b": "c"的键值对在ans中存储为b->c,形如"a": {"b": "c"}的键值对在ans中存储为a.b->c。存储成这种形式,查询时直接按查询的字符串在ans中查找即可。具体实现可见代码。

注意点

  1. 同一个对象所有键值对的键必须两两都不相同,但不同对象的键可能相同,同一对象或不同对象的键与值之间可能相同。例如对于以下输入:
4 3
{
"a": {"b": "c"}
"d": {"b": "e"}
}
a
a.b
d.b
b

输出应为

OBJECT
STRING c
STRING e
NOTEXIST
  1. 所有字符串都不是空串。所有作为键的字符串不会包含小数点.。查询时键的大小写敏感。
#include<bits/stdc++.h>
using namespace std;
unordered_map<string,string>ans;//存储键值对
int n,m;stringstream all;//按空格字符分割字符串
bool dfs(string key){
string val;all>>val;
if(val=="}") return ;//表示当前值对象已读取完毕
if(val=="{"){
if(key!="") ans[key]="{}";//键不是空字符串,该键对应的值是一个对象
while(dfs(key));
}
else{
string v=val.substr(,val.rfind('"')-);//除去两端的无用字符后剩余的真正的字符串
if(val.back()==':') dfs(key==""?v:(key+"."+v));/*末尾是:字符,表示该字符串是键,递归处理其值*/else ans[key]=v;//该字符串是值,将键和值映射起来
}
return ;
}
int main(){
string line,s="";
for(scanf("%d%d\n",&n,&m);n--;getline(cin,line),s+=line);
s=regex_replace(s,regex(" "),"");//去掉s中所有的空格字符
s=regex_replace(s,regex("\\\\\""),"\"");//将\"字符转换为"字符
s=regex_replace(s,regex("\\\\\\\\"),"\\");//将两个连续的\\字符转换为单个\字符
s=regex_replace(s,regex(","),", ");//在每个,字符后添加一个空格字符
s=regex_replace(s,regex(":"),": ");//在每个:字符后添加一个空格字符
s=regex_replace(s,regex("\\{")," { ");//在每个{字符左右均添加空格字符
s=regex_replace(s,regex("},?")," } ");//在每个}字符左右均添加空格字符
all<<s;//将字符串s送入all中按空格分割
dfs("");
while(m--){
cin>>s;
if(ans.find(s)==ans.end()) puts("NOTEXIST");else
if(ans[s]=="{}") puts("OBJECT");else
printf("STRING %s\n",ans[s].c_str());
}
return ;
}

CCF 201709-3 JSON查询的更多相关文章

  1. CCF CSP 201709-3 JSON查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...

  2. CCF(JSON查询:40分):字符串+模拟

    JSON查询 201709-3 纯字符串模拟,考的就是耐心和细心.可惜这两样我都缺... #include<iostream> #include<cstdio> #includ ...

  3. ccf题库20170903--Json查询

    题目如下: 试题编号: - 试题名称: JSON查询 时间限制: .0s 内存限制: .0MB 问题描述: 问题描述 JSON (JavaScript Object Notation) 是一种轻量级的 ...

  4. JS 实现Json查询的方法实例

    其实很简单,我这部分代码,前一部分是简单的实现如何使用JS写模板,第二个就是具体的实现了JSON查询的一个扩展. 以后查询Json就有了利器了. 代码如下: /*         * 定义模板函数   ...

  5. CCF CSP 201612-3 权限查询

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201612-3 权限查询 问题描述 授权 (authorization) 是各类业务系统不可缺 ...

  6. CCF-CSP题解 201709-3 JSON查询

    要求写一个小程序完成JSON查询的功能. 查询dfs就好了. 存储JSON对象用图(树)就好,把\(<key[],type,val[]>\)作为节点,然后又是字符串处理了. 其实就是个简化 ...

  7. CCF-CSP 201709-3 JSON查询 题解

    试题编号: 201709-3 试题名称: JSON查询 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 JSON (JavaScript Object Notation) 是一 ...

  8. MySQL全文索引、联合索引、like查询、json查询速度大比拼

    目录 查询背景 一.like查询 二.json函数查询 三.联合索引查询 四.全文索引查询 结论 查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outlin ...

  9. 【CCF】JSON查询

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

随机推荐

  1. Java 加载动态库 dll 文件

    不知道具体原理,但是,加载 dll 文件时,带路径或者更改 dll 文件的名字,都会报错.虽然库记载成功了,但是处女座认为这不可接受.于是有了这个解决方案. 在根目录为库创建软连接,然后使用 syst ...

  2. MyBatis-Plus入门Demo详解

    一.简介: 引用官方文档(本文主要参考官方文档示例): MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生 ...

  3. JAAS configuration for Kafka clients

    Clients may configure JAAS using the client configuration property sasl.jaas.config or using the sta ...

  4. Java Mockito 笔记

    Mockito 1 Overview 2 Maven 项目初始化 3 示例 3.1 第一个示例 3.2 自动 Mock 3.3 Mock 返回值 3.4 Mock 参数 3.5 自动注入 Mock 对 ...

  5. C语言----流程图(基础篇四)

    大家晚上好,最近忙每天忙于项目没有时间更新自己的博客,时间就是海绵嘛硬挤挤就是有的,咂看标题" 流程图 ",编程界的一个不可或缺的技能,特别是在做复杂的逻辑的时候要处理好每一步的关 ...

  6. Docker Cheatsheet

    一.创建 docker create:创建容器,处于停止状态. centos:latest:centos容器:最新版本(也可以指定具体的版本号).本地有就使用本地镜像,没有则从远程镜像库拉取.创建成功 ...

  7. Beyond Compare 4 30天评估期结束的解决办法

    修改注册表 regedit注册表中删除项目:HKEY_CURRENT_USER\Software\Scooter Software\Beyond Compare 4\CacheId 删除dll 重命名 ...

  8. 虚拟环境和pip相关的命令

    # 虚拟环境 mkvirtualenv # 创建虚拟环境 rmvirtualenv # 删除虚拟环境 workon # 进入虚拟环境.查看所有虚拟环境 deactivate # 退出虚拟环境 eg: ...

  9. js学习之存储

    一.Cookie和Session的区别 1.cookie数据存放在客户的浏览器上,session数据放在服务器上(一般以内存.数据库.文件形式). 2.session会在一定时间内保存在服务器上.当访 ...

  10. 记录下hbuilder vue项目打包APP 在IOS上点击延迟的问题

    做的项目打包成APP在IOS 上有延迟问题,在安卓下却不会,联想到之前 用IONIC时打包的APP也是 在IOS下有300毫秒延迟问题.所以 只能 认吧. 安装fastclick 插件: npm in ...