試題編號: | 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"}} 是二層結構的對象,以此類推。 |
這道題我沒能做對,後來借鑑了網上的代碼,自己敲了一遍,代碼如下:
#include <bits/stdc++.h>
using namespace std;
map<string, string> json;
string s, str;
bool key;
string handle(string str, string s)
{
if (s.empty()) {
return str;
}
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
continue;
} else if (s[i] == '{') {
json[str] = "OBJECT";
key = true;
} else if (s[i] == '}') {
int i;
for (i = str.size() - 1; i >= 0; i--) {
if (str[i] == '.') {
break;
}
}
if (i < 0) {
str = "";
} else {
str = str.substr(0, i);
}
} else if (s[i] == ':') {
key = false;
} else if (s[i] == ',') {
key = true;
} else if (s[i] == '"') {
string temp;
for (i = i + 1; i < s.size(); i++) {
if (s[i] == '\\') {
i++;
temp += s[i];
} else if (s[i] == '"') {
break;
} else {
temp += s[i];
}
}
if (key) {
if (str == "") {
str = temp;
} else {
str += '.' + temp;
}
} else {
json[str] = "STRING " + temp;
int i;
for (i = str.size() - 1; i >= 0; i--) {
if (str[i] == '.') {
break;
}
}
if (i < 0) {
str = "";
} else {
str = str.substr(0, i);
}
}
}
}
return str;
}
int main() {
int n, m;
cin >> n >> m;
cin.get();
while(n--) {
getline(cin, s);
str = handle(str, s);
}
while(m--) {
cin >> s;
cout << (json[s] == "" ? "NOTEXIST" : json[s]) << endl;
}
return 0;
}