ccf題庫20170903--Json查詢

来源:http://www.cnblogs.com/JsonZhangAA/archive/2017/11/25/7896847.html
-Advertisement-
Play Games

題目如下: 這題我剛開始被示例給迷惑了,是將key和value分開輸入的,類似於cin>>key>>value,這裡應該是要講每行字元串連接成一個新的字元串,然後遍歷整個字元串,遇到:表示key錄入完畢,遇到,和},要先判斷,的情況,確定,前面沒有},這是才表示value錄入完畢。再就是首碼的問題, ...


題目如下:

試題編號:    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; 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近總是記不住表單提交的幾種方式,並且各種方式的適應場景也不知道,乾脆來總結一次,當再學習過程。 首先從最簡單的開始練手: 【1】、純form表單形式,無js和ajax ,提交路徑有action決定,方式由method決定,如果需要傳輸文件加上enctype 我的表單內容:兩個下拉選擇、一個文件選擇 ...
  • 本人學習.Net開發已有很長一段時間了,但平時疏於對知識系統化的歸納和總結,多次面試中屢屢碰壁。所以痛定思痛,決心把一些知識整理到博客中,以便自己瀏覽學習。園子中有很多好文和技術大牛分享的經驗。我會抄錄一些內容到我的博客,並標明出處。先謝過各位了。 ...
  • 通過ADO.NET技術,我們可以高效的完成客戶端同資料庫之間的數據訪問操作,便於我們在客戶端程式簡便高效的訪問以及獲取資料庫中的有用數據,同時也可以對資料庫中的數據進行更新,即可以完成客戶端與資料庫之間的雙向操作。本文簡單介紹如何在客戶端程式中利用ADO.NET技術來訪問以及使用資料庫中的數據。 A ...
  • 返回總目錄 本小節目錄 Introduce Foreign Method(引入外加函數) Introduce Local Extension(引入本地擴展) Introduce Foreign Method(引入外加函數) Introduce Local Extension(引入本地擴展) 7Int ...
  • 學習java之後,到企業的崗位 技術:java軟體開發工程師(中初級):技術一般; 高級工程師:技術高等; 技術架構師;技術頂級; 管理:項目經理;產品經理; 質詢:質詢顧問;銷售經理; 學會之後可以根據個人的愛好去從事相關的職位,但是不管是做哪一個都是需要技術的底子。希望能幫到你們。在這裡我也提醒 ...
  • 兩種用法介紹如下:1.range([start], stop[, step])返回等差數列。構建等差數列,起點是start,終點是stop,但不包含stop,公差是step。start和step是可選項,沒給出start時,從0開始;沒給出step時,預設公差為1。例如: 2.xrange([sta ...
  • 設計模式是對問題行之有效的解決方案,它其實是一種思想。 單例設計模式: 解決的問題:可以保證一個類在記憶體中只能有一個對象。(比如多個程式使用相同的配置信息對象時,就需要保證對象的唯一性) 如何保證唯一性:1、不允許其他程式用new創建類對象 2、在該類中創建一個本類實例 3、對外提供一個方法讓其他程 ...
  • ecto 簡介 ecto 相當於 elixir 的 ORM,但是得益於 elixir 語言,和傳統的 ORM 相比,更加簡潔和強大。 ecto 主要分為 4 部分: 1. Repo: 這是和真正資料庫交互的部分 2. Schema: 相當於是資料庫中表的定義,但不僅僅是定義 3. Changeset ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...