1 条题解

  • 0
    @ 2025-5-6 20:37:31

    简单解题思路

    问题描述

    给定一段 JSON 格式的代码(可能没有缩进或格式混乱),要求:

    1. 格式化输出,使其符合标准的缩进和换行规则。
    2. 处理大括号 {}、分号 ;、逗号 , 等符号,并在适当位置添加缩进和换行。

    核心思路

    1. 逐字符解析输入

      • 使用 getline() 逐行读取输入,再逐个字符处理。
      • 遇到 {};, 等关键符号时,调整缩进或换行。
    2. 缩进控制

      • level 变量记录当前缩进层级(遇到 {level++,遇到 }level--)。
      • 每层缩进用 4 个空格 表示。
    3. 特殊符号处理

      • {:换行并增加缩进。
      • }:减少缩进并换行。
      • ;:换行并保持当前缩进。
      • ,:正常输出,后面加一个空格。
    4. 跳过空白字符

      • 忽略输入中的空格和制表符(ASCII 9)。

    关键代码解释

    1. 初始处理

      • 跳过第一个 {,并手动输出格式化后的 {\n (带缩进)。
    2. 字符分类处理

      • { → 换行 + 增加缩进。
      • } → 减少缩进 + 换行。
      • ; → 换行。
      • , → 输出 , (逗号 + 空格)。
      • 其他字符 → 直接输出(必要时先补缩进)。
    3. 终止条件

      • level == 0(所有 {} 匹配完成),退出循环。

    示例

    • 输入(混乱的 JSON):
      {a{b;c,d}e;}
      
    • 输出(格式化后):
      {
          a {
              b;
              c, 
              d
          }
          e;
      }
      

    总结

    • 核心逻辑:通过 level 控制缩进,按符号类型决定换行和空格。
    • 关键技巧:用 flag 标记是否需要补缩进,避免重复缩进。
    • 适用场景:JSON/代码格式化工具、编译器预处理等。
    #include <iostream>
    #include <cstdio>
    #include <string>
    using namespace std;
    //英语       看博友分析     抄博友程序      模拟       背        
    int main()
    {
    	//freopen("1896.txt","r",stdin);
    	int level=1;
    	while(getchar()!='{');//抄博友程序 
    	printf("{\n    ");//抄博友程序 
    	int flag=false;
    	string data;
    	while(getline(cin,data))
    	{
    		int len=data.length();
    		for(int i=0;i<len;i++)
    		{
    			if(data[i]==' '||data[i]==9)//抄博友程序    ascii 9  水平制表符
    			{
    				
    			}else if(data[i]=='{')
    			{
    				printf(" {\n");//抄博友程序 PE 
    				level++;
    				/* 
    				for(int i=0;i<level;i++)//ac
    				{
    					printf("    ");
    				}*/				
    				flag=true;
    			}else if(data[i]==';')
    			{
    				printf(";\n");
    				flag=true;				
    			}else if(data[i]=='}')
    			{
    				level--;
    				for(int i=0;i<level;i++)
    				{
    					printf("    ");
    				}
    				printf("}");
    				flag=false;//抄博友程序 
    			}else if(data[i]==',')
    			{
    				printf(", "); 
    			}else
    			{
    				if(flag)
    				{
    					for(int i=0;i<level;i++)
    					{
    						printf("    ");
    					}
    					flag=false;
    				}
    				printf("%c",data[i]); 
    			}			
    		}
    		if(level==0)
    		{
    			break;
    		}
    	}
    	printf("\n");
    	return 0;
    } 
    
    
    • 1

    信息

    ID
    897
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者