在做学校的练习题的时候遇见的题目,感觉挺有意思的,一开始想的是使用结构体,构建json节点,结构体中包含string类型的key和object类型的value,因为json记录的值可能是数组,可能是对象,可能是字符串或者是数字,但是在C#中都是object的派生类,所以创建一个object类的value即可。但是这样构建出来的json最后输出的时候还是要进行格式化的输出,相当于一开始输入格式化成json再把json的结构体格式化输出成字符串,复杂了一些,于是想到直接用栈储存json中的括号,每次返回上一级的时候出栈,栈空即结束。这样题目就像是一个简单的分支判断题目。
题目:
出题人一时兴起,来了个大模拟
题目要求根据输入,构建一段json
字符串
json中含以下几种元素
- 对象
- 数组
- 记录(我自己这样叫它)
记录,是一种"名字":值
形式的字符串
如下面格式即记录
"ett":"1593050051366"
值不仅仅可以是一个字符串,也可以是一个对象或数组
如
"cm":{
"ln":"-55.0",
"sv":"V2.9.6",
"os":"8.0.4",
"g":"C6816QZ0@gmail.com",
"mid":"489",
"nw":"3G",
"l":"es",
"vc":"4",
"hw":"640*960",
"ar":"MX",
"uid":"489",
"t":"1593123253541",
"la":"5.2",
"md":"sumsung-18",
"vn":"1.3.4",
"ba":"Sumsung",
"sr":"I"
}
(数据来自百度截取,干啥的我也不知道)
"你" : [18874,15157]
对象,即使用大括号{}
括起来的多个(或单个甚至无)记录组成,多个记录之间用逗号,
隔开
{
"ln":"-55.0",
"sv":"V2.9.6",
"os":"8.0.4",
"g":"C6816QZ0@gmail.com",
"mid":"489",
"nw":"3G",
"l":"es",
"vc":"4",
"hw":"640*960",
"ar":"MX",
"uid":"489",
"t":"1593123253541",
"la":"5.2",
"md":"sumsung-18",
"vn":"1.3.4",
"ba":"Sumsung",
"sr":"I"
}
这就是一个对象
数组是有多个值组成,包含在方括号[]
中,同样以逗号,
隔开,如
["aaa","bbb","ccc"]
json格式非常自由,可以不使用换行符和空格,只要符合上述格式,它就是合法的json
同时,json数据的值可以是文本,也可以是整数布尔型等
在此题目做出以下简化:
- 输出格式不包含任何空格和换行
- 值仅包含文本型,即值仅有用引号
""
包含的一种格式输入格式:
输入包含多行,规则如下
1 name vaule
插入一个记录,名字为name
,记录值为vaule
2 name
插入一个值为数组的记录,并在之后输入进入数组的输入(进入下一级记录)3 name
插入一个值为对象的记录,名字为name
,并在之后的输入进入对象的输入(进入下一级记录)0
本级输入完毕,退回到上级输入
最上级输入完毕后,即输入结束
关于数组的输入:
数组每个元素可以看作没有名字的记录,因此,数组的输入格式如下
1 vaule
插入一个记录,记录值为vaule
2
插入一个值为数组的记录,并在之后输入进入数组的输入(进入下一级记录)3
插入一个值为对象的记录,并在之后的输入进入对象的输入(进入下一级记录)0
数组输入完毕
输出格式:
输出一段不包含换行和空格的json数据
输入样例:
1 a 1
1 b 12345
2 c
1 1
1 2
1 3
1 4
1 5
0
2 d
3
1 a 1
1 b 2
0
3
1 c 4
1 d 5
0
0
0
输出样例:
{"a":"1","b":"12345","c":["1","2","3","4","5"],"d":[{"a":"1","b":"2"},{"c":"4","d":"5"}]}
输入解释
1 a 1 插入记录"a":"1"
1 b 12345 插入记录"b":"12345"
2 c 插入一个数组
1 1 插入记录"1"
1 2 插入记录"2"
1 3 插入记录"3"
1 4 插入记录"4"
1 5 插入记录"5"
0 数组输入完毕
2 d 插入数组
3 插入一个对象
1 a 1 对象第一项为“a”:"1"
1 b 2对象第二项为“b”:"2"
0 对象输入完毕
3
1 c 4
1 d 5
0 (以上4行同上)
0 数组输入完毕
0 对象(最顶层的)输入完毕
题目说明
- 输入保证所以输入字符串长度小于100
- 最外层也为对象,因此最外层有
{}
包括 - 输出顺序与输入相同
出题人用c实现的,你好意思拿python吗(- 如果有问题,请优先在群内问,这样你的问题其他同学也可以看见,其他同学的问题,你也可以看见,同时有多个同学可以来一起帮助你,效率非常高。
- 私聊在解决问题方面,效率很低,如果你想尽快的解决问题,请优先在群里问。
using System;
using System.Collections.Generic;
using System.Text;
// ReSharper disable once CheckNamespace
public static class Program
{
private static readonly Stack<char> Stack = new Stack<char>();
public static void Main()
{
Stack.Push('}');
var ans = new StringBuilder();
ans.Append('{');
var flag = 0;
while (Stack.Count != 0)
{
var input = Console.ReadLine()?.Trim().Split();
switch (input?[0])
{
case "1":
if (input.Length == 3)
{
ans.Append($"\"{input[1]}\":\"{input[2]}\",");
}
else
{
ans.Append($"\"{input[1]}\",");
}
break;
case "2":
if (input.Length == 2)
{
Stack.Push(']');
ans.Append($"\"{input[1]}\":[");
}
else
{
flag = 1;
}
break;
case "3":
if (input.Length == 1)
{
Stack.Push('}');
ans.Append("{");
}
else
{
ans.Append($"\"{input[1]}\":"+"{");
Stack.Push('}');
}
break;
case "0":
if (ans[ans.Length - 1] == ',')
{
ans.Remove(ans.Length - 1, 1);
}
ans.Append(Stack.Pop());
ans.Append(',');
break;
default:
switch (flag)
{
case 1:
Stack.Push(']');
ans.Append($"\"{input?[0]}\":[");
break;
}
break;
}
}
ans.Remove(ans.Length - 1, 1);
Console.WriteLine(ans);
}
}
发表回复