记录一到当时没做出来的 “解析Json计算表达式值” 的算法题

2023-05-16

转载请以链接形式标明出处:

本文出自:103style的博客

题目描述

给定表达式
A = [
"${a.b.c}",
"${not a.b.c}",
"${a.b.d} AND {m.n}",
"${a.b.d} OR {m.n}","${a.b.c} OR ((${not a.b.d} AND ${a.b.e}) AND ${not a.b.f})"
];

1 代表 true, 0 代表 false.

给定 json 字符串 B = {"a":{"b":{"c":"0","d":"1","e":"1","f":"0"}},"m":{"n":"0"}};

请返回一个 长度为 A长度 的 boolean 数组,对应位置为表达式的值。


个人算法

仅仅是保证题目做出来, 如果有描述错误的地方,或者更好的建议请留言告诉我。谢谢。

public class LeetCodeTest {

    private final String T = "True";
    private final String F = "False";
    private final String AND = "AND";
    private final String OR = "OR";
    private int curIndex = 1;

    public static void main(String[] args) {
        String[] A = new String[]{
                "${a.b.c}",
                "${not a.b.c}",
                "${a.b.d} AND {m.n}",
                "${a.b.d} OR {m.n}",
                "${a.b.c} OR ((${not a.b.d} AND ${a.b.e}) AND ${not a.b.f})"
        };
        //0:false  1:true
        String B = "{\"a\":{\"b\":{\"c\":\"0\",\"d\":\"1\",\"e\":\"1\",\"f\":\"0\"}},\"m\":{\"n\":\"0\"}}";
        
        boolean[] res = new LeetCodeTest().getFormatRes(A, B);
        
        StringBuilder sb = new StringBuilder();
        for (boolean r : res) sb.append(r).append(" ");

        System.out.println(sb.toString());
    }

    //{
//  a:{
//     b:{
//         c:0,
//         d:1,
//         e:1,
//         f:0
//       }
//    },
//  m:{
//     n:0
//    }
//}
    boolean[] getFormatRes(String[] arr, String json) {
        char[] jArr = json.toCharArray();
        //去掉开始的 {
        HashMap<String, Object> map = getDecodeMap(jArr, 1);
        HashMap<String, Boolean> regMap = new HashMap<>();
        getRegMap(map, regMap, "");

        boolean[] res = new boolean[arr.length];
        for (int i = 0; i < arr.length; i++) {
            String t = arr[i].replaceAll("\\$", "");
            res[i] = getRegRes(regMap, t);
        }
        return res;
    }

    /**
     * 计算表达式的结果
     *
     * @param mapReg 记录表达式的集合
     * @param s      当前解析的表达式
     */
    boolean getRegRes(HashMap<String, Boolean> mapReg, String s) {
        if (T.equals(s)) return true;
        else if (F.equals(s)) return false;

        if (s.contains("(")) {
            int e = s.indexOf(")");
            int f = s.substring(0, e).lastIndexOf("(");
            String item = s.substring(f, e + 1);
            boolean res = getRegRes(mapReg, item.substring(1, item.length() - 1));
            return getRegRes(mapReg, s.replace(item, res ? T : F));
        } else if (s.contains(OR)) {
            String[] arr = s.split(OR);
            for (String a : arr) {
                if (getRegRes(mapReg, a.trim())) return true;
            }
            return false;
        } else if (s.contains(AND)) {
            String[] arr = s.split(AND);
            for (String a : arr) {
                if (!getRegRes(mapReg, a.trim())) return false;
            }
            return true;
        } else {
            return mapReg.get(s.trim());
        }
    }

    /**
     * 记录所有的表达式
     *
     * @param map    json解析之后的数据
     * @param regMap 保存表达式的集合
     * @param reg    当前的表达式
     */
    private void getRegMap(HashMap<String, Object> map, HashMap<String, Boolean> regMap, String reg) {
        for (Map.Entry<String, Object> item : map.entrySet()) {
            if (item.getValue() instanceof HashMap) {
                getRegMap((HashMap<String, Object>) item.getValue(), regMap, reg + item.getKey() + ".");
            } else {
                boolean res = "1".equals(item.getValue());
                regMap.put("{" + reg + item.getKey() + "}", res);
                regMap.put("{not " + reg + item.getKey() + "}", !res);
            }
        }
    }

    /**
     * 解析json字符传   暂时不支持 数组[]
     *
     * @param jArr  jsonString的 char数组
     * @param start 开始的下标
     */
    private HashMap<String, Object> getDecodeMap(char[] jArr, int start) {
        HashMap<String, Object> map = new HashMap<>();
        StringBuilder keyBuild = new StringBuilder();
        StringBuilder valueBuild = new StringBuilder();
        //记录冒号的个数 "":""
        // colonCount = 1 表示开始记录key
        // colonCount = 3 表示开始记录value
        int colonCount = 0;
        for (int i = start; i < jArr.length; i++) {
            if (jArr[i] == '}') {
                //记录当前走到的位置
                curIndex = i;
                return map;
            } else if (jArr[i] == '{') {
                map.put(keyBuild.toString(), getDecodeMap(jArr, i + 1));
                //更新到最新的位置
                i = curIndex;
            } else if (jArr[i] == '"') {
                colonCount++;
                if (colonCount % 4 == 0) {
                    map.put(keyBuild.toString(), valueBuild.toString());
                }
            } else if (jArr[i] == ',') {
                //重置变量
                colonCount = 0;
                keyBuild = new StringBuilder();
                valueBuild = new StringBuilder();
            } else {
                if (colonCount % 4 == 1) {
                    keyBuild.append(jArr[i]);
                } else if (colonCount % 4 == 3) {
                    valueBuild.append(jArr[i]);
                }
            }
        }
        return map;
    }

}

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1uzczhff706sm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记录一到当时没做出来的 “解析Json计算表达式值” 的算法题 的相关文章

  • Java Steam.filter() 过滤 通过Predicate&lt;T&gt;实现 多条件动态 or and 过滤

    61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • mysql 判断字段否存在,如果存在就修改字段

    先建一个存储过程 xff0c 再执行存储过程 xff0c 然后删掉存储过程 DROP PROCEDURE IF EXISTS proc tempPro CREATE PROCEDURE proc tempPro BEGIN SELECT c
  • mysql 常用脚本整理

    MySQL 来自各种资源 及部分自己实践 添加字段 ALTER TABLE 表名 ADD COLUMN 列名 类型 comment 39 说明 39 ALTER TABLE User ADD COLUMN shorName varchar
  • Docker Center OS7笔记--删除镜像(httpd)

    删除镜像 xff08 httpd xff09 1 docker stop docker ps a q 停止所有容器 2 docker ps a 查看容器 3 docker rm 容器ID 删除容器 删除后 xff0c 就没有容器了 4 do
  • SqlServer 2008R2 10.50.1600.1 升级到 SqlServer 2016

    要从sql server 2008 R2 企业版 直接升级到 2016 企业版 要先把R2升级到SP3这个版本 xff08 注意 xff1a 不是sp1 sp2 sp3的安全更新 坑 xff09 然后去下载2016 去itellyou下载
  • C#委托与事件

    1 什么是委托 委托是C 中的一个引用类型 它允许捕捉对方法的引用 xff0c 并像传递其他对象那样传递该引用 xff0c 也可以像调用其他方法一样调用被捕捉的方法 声明委托需要使用delegate关键字 xff1a span class
  • 数据分发服务 (DDS)及Fast DDS环境搭建

    1 数据分发服务 DDS 数据分发服务 DDS 是一种以 数据为中心的通信协议 xff0c 用于分布式软件应用程序通信 它描述了支持数据提供者和数据消费者之间通信的通信应用程序编程接口 API 和通信语义 由于它是一个以数据为中心的发布订阅
  • Docker管理工具Web UI:DockerUI & Shipyard /portainer

    docker针对于系统工程师或者开发人员来说操作比较简单 一般我们习惯了对着黑黑的屏幕敲命令 xff0c docker pull xff0c docker push xff0c docker run xff0c docker logs xf
  • BeautifulSoup+pandas 爬取新浪国内新闻

    xff08 1 xff09 使用技术 python 3 5 2 sqlite3 pandas requests jupyter notebook xff08 2 xff09 详细代码 新浪国内新闻首页 xff1a http news sin
  • android8.1客制化修改文档

    1 去除设置 系统 关于手机 硬件信息去掉 vendor mediatek proprietary packages apps MtkSettings res xml device info settings xml中删除布局文件 xff0
  • C/C++总结笔记——指针1:野指针、空指针(NULL和nullptr)、悬空指针、智能指针

    C C 43 43 中有几种指针相关的概念 xff0c 只知道有这样的概念 xff0c 但HR一问就露馅 xff0c 这里进行总结方便复习 1 野指针 1 指针定义时未被初始化 xff1a 指针在被定义的时候 xff0c 如果程序不对其进行
  • ARM汇编的编程模式和工作模式

    ARM采用32位架构 ARM 约定 Byte 8bitsHalfword 16bits 2byteWord 32 bits 4bytes ARM core 的指令集 ARM指令集 32 bitThumb指令集 xff08 沙姆 xff09
  • 嵌入式开发内存节约方法(笔记)

    1 不要在 h文件中定义变量 xff0c 可以声明一个extern全局变量 xff0c 定义在某一个 c文件中进行 其他 c文件即可共用 在源文件中引入头文件相当于直接把头文件的内容拷贝到原文件中 xff0c 如果引入这个头文件后 xff0
  • Linux内核进程上下文切换深入理解

    我们知道操作系统的一个重要功能就是进行进程管理 xff0c 而进程管理就是在合适的时机选择合适的进程来执行 xff0c 在单个cpu运行队列上各个进程宏观并行微观串行执行 xff0c 多个cpu运行队列上的各个进程之间完全的并行执行 进程管
  • 尚医通开发笔记(结尾含部分bug修复方法)

    目录 项目简介 xff1a 包含系统 项目架构 前端开发流程 xff1a common模块 swagger2 Result xff08 全局统一返回结果 xff09 YyghException xff08 自定义全局异常 xff09 Glo
  • 树莓派上的软件安装和卸载命令汇总

    基础命令 安装软件 apt get install softname1 softname2 softname3 卸载软件 apt get remove softname1 softname2 softname3 卸载并清除配置 apt ge
  • ubuntu安装KDE桌面环境

    ubuntu安装KDE桌面环境 打开shell环境 xff0c 执行sudo apt get install kubuntu desktop xff0c 然后会提示一大堆的软件包要安装 xff0c 注意安装好之后有1G多 lxc 64 lx
  • 游戏开发书籍推荐

    游戏开发书籍推荐 xff08 1 3 1 Windows游戏编程大师技巧 xff08 第二版 xff09 原名 xff1a Tricks of the Windows Game Programming Gurus 2nd 作者 xff1a
  • ROS实战之ROS组网的搭建

    搭建ROS组网 工具 xff1a 台式机 xff08 Ubuntu xff09 xff1a 192 168 2 101 笔记本 xff08 虚拟机 xff09 xff1a 192 168 2 106 步骤 xff08 此处以在笔记本中运行r
  • Mavlink协议(第二版)

    文章目录 协议简介一 Mavlink协议主要特点 二 数据结构不兼容标志 MAVLink 2 兼容性标志 MAVLink 2 有效载荷格式MAVLink 2 的数据包格式 三 航点协议四 参数的读写五 增加新的mavlink消息六 消息的发

随机推荐