分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

ccf 201709-3 JSON查询

发布时间:2023-09-06 01:44责任编辑:熊小新关键词:暂无标签

ccf 201709-3 JSON查询

 解题思路:

  首先,先逐行读入n行数据,因为数据中会经常出现 空格 或者是 换行,所以,我们遇到空格和换行就忽略,同时将转义字符进行处理,将n行数据存入一个一维数组中。由于“n ≤ 100,每行不超过 80 个字符。m ≤ 100,每个查询的长度不超过 80 个字符”,所以我们可以将一位数组的大小设置为100*80,我偷了个懒直接设置了一维数组 in[maxn * maxn]。

  接着需要构造一个映射,即做一个 string->string 或者是 string->object 的映射。

  首先考虑string->string的映射,可以使用map<string,string>。

  string->object的映射也可以转换为string->string的映射,例如输入样例:

    10 5
    {
    "firstName": "John",
    "lastName": "Smith",
    "address": {
    "streetAddress": "2ndStreet",
    "city": "NewYork",
    "state": "NY"
    },
    "esc\\aped": "\"hello\""
    }

  其中的address即为嵌套,我们可以将address键值对应的object中的string->string映射如下存储:

    address.streetAddress -> 2ndStreet
    address.city -> NewYork
    address.state -> NY

  这样直接查找address.city就可以找到NewYork。需要注意,遇到address之后的第一个左括号‘ { ‘应该先存入:

    address  ->  OBJECT

  多层嵌套怎么处理呢,我们可以将一个object看成一个递归结构,每次遇到左花括号"{"就调用处理object的函数,进行处理。

  开始的时候,在main函数中调用

  solve("",in+1);//处理第一层嵌套

  含义是:当前key为空,去掉左边第一个花括号,进入第一层嵌套。solve的功能就是进行string->string的映射,在记录完key值之后,遇到左括号‘ { ‘,就继续调用solve进行处理。

  详细如何进行string->string的映射就...看代码吧

 1 #include<iostream> 2 #include<cstring> 3 #include<map> 4 using namespace std; 5 const int maxn = 100+5; 6 map<string,string> dic; ?7 char in[maxn*maxn]; 8 ?9 int solve(char *key,char *a)10 {//处理的字符串的长度 11 ????for(int i=0;i<strlen(a);i++)12 ????{13 ????????char nowKey[maxn],value[maxn]; 14 ????????int lenKey = strlen(key);15 ????????int k=0;16 ????????for(k=0;k<lenKey;k++)17 ????????????nowKey[k] = key[k];18 ????????nowKey[k] = ‘\0‘;19 ????????if(lenKey > 0)20 ????????{21 ????????????nowKey[lenKey++] = ‘.‘;22 ????????????nowKey[lenKey] = ‘\0‘;23 ????????}24 ????????if(a[i] == ‘"‘)//key的第一个引号25 ????????{26 ????????????i++;27 ????????????while(a[i] != ‘:‘)28 ????????????{29 ????????????????nowKey[lenKey++] = a[i++]; 30 ????????????}31 ????????????nowKey[lenKey-1] = ‘\0‘;32 ?????????} 33 ?????????//i++;//:34 ?????????i++;//"或是{35 ?????????if(a[i] == ‘"‘){36 ?????????????///得到value的值,建立map 37 ?????????????int j=7;38 ?????????????i++;39 ?????????????strcpy(value,"STRING ");40 ?????????????while(a[i] != ‘,‘ && a[i] != ‘}‘){41 ?????????????????value[j++] = a[i++];42 ?????????????}43 ?????????????value[j-1] = ‘\0‘;44 ?????????????dic[nowKey] = value;45 ?????????}else if(a[i] == ‘{‘)46 ?????????{47 ??????????????///首先存储nowKey到map中48 ?????????????dic[nowKey] = "OBJECT";49 ?????????????i += solve(nowKey,a+i+1)+1;50 ??????????} 51 ??????????//i++;//,或是}52 ??????????if(a[i] == ‘}‘)53 ??????????????return i+1;54 ???????????//如果是,则继续处理 55 ????}56 }57 58 int main()59 {60 ????string str;61 ????int n,m;62 ????cin>>n>>m;63 ????n = n+1;64 ????int i=0;65 ????while(n--)66 ????{///除了字符串内部的位置,其他位置都可以插入一个或多个空格使得 JSON 的呈现更加美观,67 ????///也可以在一些地方换行,不会影响所表示的数据内容。68 ????///为了处理掉多余的空格和换行,我将输入数据存储到一个一维的char数组中 69 ????????getline(cin,str);70 ????????///将读入的字符串先进行处理,存储到字符数组中71 ????????for(int k=0;k<str.length();k++)72 ????????{73 ????????????if(str[k]==‘\\‘)74 ????????????????in[i++] = str[++k];75 ????????????else if(str[k] == ‘ ‘ || str[k] == ‘\n‘)76 ????????????????continue;77 ????????????else{78 ????????????????in[i++] = str[k];79 ????????????}80 ?????????} 81 ????}82 ????in[i] = ‘\0‘;83 ????solve("",in+1);//处理第一层嵌套 84 ????85 ????for(int j=0;j<m;j++)86 ????{87 ????????string str2;88 ????????getline(cin,str2);89 ????????map<string,string>::iterator iter = dic.find(str2);90 ????????if(iter != dic.end())91 ????????{//找到了 92 ????????????cout<<dic[str2]<<endl;93 ????????}else{94 ????????????cout<<"NOTEXIST"<<endl;95 ????????}96 ????}97 ????//printf("%s\n",in);98 ????return 0;99 }

ccf 201709-3 JSON查询

原文地址:https://www.cnblogs.com/yxh-amysear/p/8524684.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved