Java C++刷题leetcode1106解析布尔表达式

Java C++刷题leetcode1106解析布尔表达式

问题描述

给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。

有效的表达式需遵循以下约定:

  • "t",运算结果为 True
  • "f",运算结果为 False
  • "!(expr)",运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
  • "&(expr1,expr2,...)",运算过程为对内部表达式 expr1, expr2等进行逻辑 与的运算(AND)
  • "|(expr1,expr2,...)",运算过程为对内部表达式 expr1, expr2等进行逻辑 或的运算(OR)

示例1:

输入:expression = "!(f)"
输出:true

示例2:

输入:expression = "|(t,f)"
输出:true

思路分析

可以用递归的方法来解决这个问题。可以看到,每一个布尔表达式都是由内部表达式或者表达式组成的。所以可以考虑先切分出每个内部表达式,对内部表达式进行计算,再根据组合方式进行整体计算。

具体的做法是,先切分出内部表达式。根据第一个字符是否是"(", "!"或者"t", "f"等来分类。"("表示需要递归计算内部表达式的值,"!"表示需要对当前内部表达式值进行取反的计算,"t"和"f"表示内部表达式值已经确定,无需再进行计算。

对内部表达式计算的方法,与上述方法类似,先根据第一个字符进行分类,递归计算后根据符号进行整体计算。

最后整体计算的时候,根据当前递归到的位置来判断是进行"|"运算还是"&"运算。

代码实现

可以用Java或C++来实现以上逻辑,下面是Java的实现代码(注意代码注释):

class Solution {

    public boolean parseBoolExpr(String expression) {
        char[] expChars = expression.toCharArray();
        int[] idx = {0};
        return calculate(expChars, idx);
    }

    private boolean calculate(char[] chars, int[] idx) {
        // 首先判断当前表达式是由何种内部表达式构成("(", "!", "t"或"f")
        char operator = chars[idx[0]];
        idx[0]++;
        if (operator == 't') {
            return true;
        } else if (operator == 'f') {
            return false;
        } else if (operator == '!') {
            return !calculate(chars, idx);
        } else if (operator == '&') {
            // 递归计算每个内部表达式的值
            boolean result = true;
            boolean end = false;
            while (!end) {
                boolean subExp = calculate(chars, idx);
                result &= subExp;
                char nextChar = chars[idx[0]];
                if (nextChar == ')') {
                    end = true;
                    idx[0]++;
                } else if (nextChar == ',') {
                    idx[0]++;
                }
            }
            return result;
        } else if (operator == '|') {
            // 递归计算每个内部表达式的值
            boolean result = false;
            boolean end = false;
            while (!end) {
                boolean subExp = calculate(chars, idx);
                result |= subExp;
                char nextChar = chars[idx[0]];
                if (nextChar == ')') {
                    end = true;
                    idx[0]++;
                } else if (nextChar == ',') {
                    idx[0]++;
                }
            }
            return result;
        }
        return false;
    }
}

示例说明

以第二个示例为例,输入字符串为"|(t,f)",调用"parseBoolExpr"方法后,实际是递归调用calculate方法,进行如下计算过程:

  1. calculate('|\^'(t,f),1)
  2. calculate(t,2)
  3. 返回true
  4. calculate(f,4)
  5. 返回false
  6. 返回true|false,也就是true

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++刷题leetcode1106解析布尔表达式 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • SpringBoot整合spring-data-jpa的方法

    下面是关于Spring Boot整合spring-data-jpa的方法的详细攻略: 1. 引入依赖 在pom.xml文件中,增加以下两个依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st…

    Java 2023年5月20日
    00
  • JSP之EL表达式基础详解

    JSP之EL表达式基础详解 什么是EL表达式 EL表达式全称是Expression Language,翻译成中文叫做表达式语言,是一种用于在JSP页面中访问JavaBean中数据的简便方法。EL表达式可以相对简洁地访问各种JavaBean的属性、方法和数组元素,而不必显式地使用Java代码进行操作。通过使用EL表达式,可大大简化JSP页面的代码和逻辑,提高J…

    Java 2023年6月15日
    00
  • 打卡每日10道面试题——JVM篇

    打卡每日10道面试题——JVM篇攻略 简介 本打卡活动旨在通过每天解答10道JVM面试题来加深JVM的理解和应用,提高应聘者面试成功率。本文将为大家提供一个完整的JVM打卡攻略,包括学习路线、注意点和解答示例等。 学习路线 第一阶段:JVM基础知识学习 在这个阶段,你需要学习JVM的基本概念和原理,掌握Java类的加载、链接和初始化过程,了解JVM的内存模型…

    Java 2023年5月20日
    00
  • Java servlet后端开发超详细教程

    Java Servlet后端开发超详细教程 本文主要介绍Java Servlet后端开发的详细流程,包括搭建开发环境、创建Servlet、处理请求、响应结果等过程。 搭建开发环境 安装Java JDK:下载JDK并完成安装,配置环境变量。 下载并安装Eclipse:Eclipse是一款强大的集成开发环境,可用于Java开发。 安装Tomcat:Tomcat是…

    Java 2023年5月19日
    00
  • JDBC中resutset接口操作实例详解

    JDBC中ResultSet接口操作实例详解 一、ResultSet简介 ResultSet接口是Java程序中访问数据库返回的数据的一个接口,通过该接口我们可以对返回的数据进行操作。该接口在JDBC规范中属于处理查询结果的API,我们可以通过该接口获取到查询结果集中所有的行信息并且可以从结果集中获取指定行列的数据。 下面我们将通过示例讲解ResultSet…

    Java 2023年6月16日
    00
  • 带你入门Java的数组

    带你入门Java的数组 简介 数组是Java编程中的一种数据结构,可以用来保存一组数据。数组可以存储基本数据类型(如整数、浮点数等),或者是对象类型。在Java中,数组是一个固定长度的对象容器。要使用数组,必须先声明一个数组变量,然后在内存中分配一定数量的连续空间以容纳数组中的元素。 声明数组变量 要声明一个数组变量,需要指定该数组的元素类型和数组的名称。如…

    Java 2023年5月26日
    00
  • Java编程中二维数组的初始化和基本操作实例

    Java编程中二维数组的初始化和基本操作实例 什么是二维数组? 在Java中,数组是一种引用数据类型。如果数组的元素也是数组,那么这个数组就称为二维数组。二维数组实际上就是一个包含其他数组的数组,对于一个二维数组,我们可以把它想象成一个表格,其中每一个元素都有行和列的下标来确定它的位置。 如何初始化二维数组? 在 Java 中,我们可以使用两种方式来初始化一…

    Java 2023年5月26日
    00
  • 详解RabbitMQ中延迟队列结合业务场景的使用

    详解RabbitMQ中延迟队列结合业务场景的使用 本文将介绍如何使用RabbitMQ中的延迟队列来解决一些常见的业务场景,并提供示例代码帮助读者理解。 什么是RabbitMQ延迟队列 RabbitMQ延迟队列是指一种可以发送延迟消息的队列,它的原理是将消息发送到一个绑定了“延迟 exchange”和“延迟 queue”的队列中,消息在该队列中暂时屏蔽,直到消…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部