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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...