题目描述:(题目来源:LeetCode)

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

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:expression = "&(t,f)"
输出:false

示例 4:

输入:expression = "|(&(t,f,t),!(t))"
输出:false

语言:Kotlin

解题思路:看到题目的首先想法是进行想要由外而内进行递归,因为如题所诉的情况中,使用递归是比较好的,但是在Kotlin中,字符串的操作和java是一样的,所以从外部往内递归是比较麻烦的,于是就想到了从内部往外进行递归,可以通过Kotlin的方法来获取第一个最小单位的位置,然后再判断这个最小单位为true或false,然后再将对应最小单位换为“t”或“f”,然后进行递归

例如示例4:

我们可以通过String.indexOf(")")获得第一个")"的index,再用String.substring(0,expression.indexOf(")")).lastIndexOf("(")可以得到对应的"("的index,

"|(&(t,f,t),!(t))",我们通过此方法,可以得到字符串&(t,f,t),我们再对此字符串进行判断,如果为true,则将字符串转换为t,否则为f,此示例可以转化为"|(f,!(t))",再通过递归,我们便可以得到结果

具体代码:

class Solution {fun parseBoolExpr(expression: String): Boolean {return prepare(expression)}fun prepare(expression: String) : Boolean {var index1 = 0var index2 = 0if (expression[0].toString().equals("t")){return true}else if (expression[0].toString().equals("f")) {return false}index2 = expression.indexOf(")")val expressions = expression.toMutableList()index1 = expression.substring(0,expression.indexOf(")")).lastIndexOf("(")if (expression[index1-1].toString().equals("!")){if (expression[index1 + 1].toString().equals("t")) {for (i in index1 .. index2){expressions.removeAt(index1)}expressions[index1-1] = 'f'}else{for (i in index1 .. index2){expressions.removeAt(index1)}expressions[index1-1] = 't'}}else {var minexpx = expression.substring(index1+1,index2).split(",")if (expression[index1 - 1].toString().equals("&")){for (minexp in minexpx){if (minexp[0].toString().equals("f")){expressions[index1-1] = 'f'break}else{expressions[index1-1] = 't'}}for (i in index1 .. index2){expressions.removeAt(index1)}}if (expression[index1 - 1].toString().equals("|")){for (minexp in minexpx){if (minexp[0].toString().toString().equals("t")){expressions[index1-1] = 't'break}else{expressions[index1-1] = 'f'}}for (i in index1 .. index2){expressions.removeAt(index1)}}}val x = String(expressions.toCharArray())return prepare(x)}
}
fun main(){println("${Solution().parseBoolExpr("|(&(t,f,t),!(t))")}")
}
//输出结果为false

算法练习-解析布尔表达式相关推荐

  1. 转盘抽奖php,使用PHP实现转盘抽奖算法案例解析

    这次给大家带来使用PHP实现转盘抽奖算法案例解析,使用PHP实现转盘抽奖算法的注意事项有哪些,下面就是实战案例,一起来看一下. 流程: 1.拼装奖项数组 2.计算概率 3.返回中奖情况 代码如下: 中 ...

  2. adaboost算法java_Adaboost 算法实例解析

    Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...

  3. 机器学习算法实现解析:libFM之libFM的训练过程之SGD的方法

    本节主要介绍的是libFM源码分析的第五部分之一--libFM的训练过程之SGD的方法. 5.1.基于梯度的模型训练方法 在libFM中,提供了两大类的模型训练方法,一类是基于梯度的训练方法,另一类是 ...

  4. 索引算法原理解析(B-tree以及磁盘存储原理)

    刚开始学习的时候,百度去查,但发现好多说得太复杂不好理解,结合各个文章总结一下(建议大概看文字,不理解不要紧,然后再看图的执行步骤然后在结合文字,这样一切就清晰好多) B-tree,B是balance ...

  5. 工业级静默活体检测开源算法技术解析记录

    工业级静默活体检测开源算法技术解析(小视科技分享) 视频链接: https://www.bilibili.com/video/BV1qZ4y1T7CH 相关背景 定义:无感鉴别镜头前人脸的真伪,人脸识 ...

  6. python函数教程:Python递归函数 二分查找算法实现解析

    这篇文章主要介绍了Python递归函数 二分查找算法实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.初始递归 递归函数:在一个函数里在调 ...

  7. python文件去重算法_使用Python检测文章抄袭及去重算法原理解析

    在互联网出现之前,"抄"很不方便,一是"源"少,而是发布渠道少:而在互联网出现之后,"抄"变得很简单,铺天盖地的"源"源 ...

  8. POS基本算法详细解析

    标题POS基本算法详细解析 粒子xi(t)与群相互交流,保存更新自己的最优点Pi(t),并且与群交流后得知全局(群)的最优点g(t),由原来的方向Vi(t)变到Vi(t+1). 首先看懂上面两张图!再 ...

  9. < 每日算法 - Javascript解析:经典弹珠游戏 >

    每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容

最新文章

  1. 来客推开源商城与你浅析:B2B2C多商户商城系统
  2. mysql 多表并列查询_MySQL-18(多表查询INNER/LEFT/RIGHT JOIN)
  3. 6、JUC--同步锁Lock
  4. Wcf 接收对http://*.*.*.*的的 HTTP 响应时发生错误... 的解决方法
  5. BUUCTF-Reverse:reverse1
  6. mysql用sql语句怎么做个脚本备份_mysql备份脚本
  7. js 中方便调试 打印日志 -- 将json 和字符串互转
  8. LNMP编译安装(centos7+nginx1.9+mysql5.6+php5.5)
  9. 虚拟主机金华php空间,金华虚拟主机_金华云虚机_金华主机申请_金华网站空间_爱名网(www.22.cn)...
  10. Storey FDR矫正方法
  11. js setInterval() 用法示例
  12. 【新东方的全套价值上亿英语资料】好不容易搞到的~
  13. 新版标准日本语中级_第十四课
  14. 2060显卡驱动最新版本_如何更新你的显卡驱动程序
  15. hexo-theme-icarus配置 valine 评论系统
  16. 中央电视台硬盘播出系统的扩展应用与维护经验(mxf 格式)
  17. RabbitMQ 四种类型发送接收数据方式
  18. FFmpeg源代码简单分析-其他-日志输出系统(av_log()等)
  19. 自动刷新网页,自动刷新当前页面,JS调用
  20. Adaptive Spectrum Noise Cancellation (自适应频谱噪声消除 ,ASNC)去除强运动伪影

热门文章

  1. 聚乙烯醇/全氟磺酸基聚合物重金属吸附膜纳米纤维膜
  2. FCOS CVPR2019
  3. python代码——计算披萨大小
  4. [19-8-21]UWP快速入门
  5. 2021年安全员-B证考试题及安全员-B证模拟考试题
  6. 人脸检测器:对DSFD的理解
  7. C++11 列表初始化(list_initialization)
  8. git rev-parse之操作笔记
  9. 微信公众号最佳实践 ( 4.3)语音识别
  10. 手机安装linux Noroot,安卓手机安装linux,Linux Deploy 和 GNURoot Debian 的尝试