• 图解LeetCode——640. 求解方程(难度:中等)


    一、题目

    求解一个给定的方程,将 x 以字符串 "x=#value" 的形式返回。该方程仅包含 '+' , '-' 操作,变量 x 和其对应系数。

    如果方程没有解,请返回 "No solution" 。如果方程有无限解,则返回 “Infinite solutions” 。

    如果方程中只有一个解,要保证返回值 'x' 是一个整数

    二、示例

    2.1> 示例 1:

    【输入】 equation = "x+5-3+x=6+x-2"
    【输出】 "x=2"

    2.2> 示例 2:

    【输入】 equation = "x=x"
    【输出】 "Infinite solutions"

    2.3> 示例 3:

    【输入】 equation = "2x=x"
    【输出】 "x=0"

    提示:

    • 3 <= equation.length <= 1000
    • equation 只有一个 '='.
    • equation 方程由整数组成,其绝对值在 [0, 100] 范围内,不含前导零和变量 'x' 。

    三、解题思路

    3.1> 思路1:

    根据题目描述,equation只有一个“=”,所以我们首先可以将整个方程的字符串通过split("=")将其拆分为两部分:左侧方程字符串&右侧方程字符串。为什么要通过等号去拆分整个方程呢?其实有两个主要的原因,首先:我们要针对方程字符串进行解析操作,那么我们可以提供一个通用的拆分方程字符串的方法,这样左侧和右侧的方程字符串都可以通过调用该方法进行拆分操作了。下面我们以equation="x+5-3+x=6+x-2"为例:

    通过等号拆分出“左侧方程字符串”和“右侧方程字符串”之后,我们就需要解析方程字符串了。字符串一般是由三种类型组成:首先,“加号”或“减号”;其次,x变量;最后,非x的整数型数字。那么,我们再解析的时候,就可以通过“加号”或者“减号”来分割运算符和非运算符。这里可以通过substring(...)indexOf(...)方法来获取子串。以字符串x+5-3+x为例,判断indexOf("-")或indexOf("+")的下标位置,取index下标值最小的作为分割末尾,此时待分割末尾index=1,所以通过e.substring(0, 1)获得截取字符串“x”。最后,我们的e就是截取后剩余的字符串。按照上面的逻辑继续的去拆分,最终会将“x+5-3+x”拆分为:“x”,“+5”,“-3”,“+x”。具体操作如下所示:

    此时有一个特殊的情况需要注意,就是如果第一个是负数,那么我们特殊处理一下,因为我们在上面的操作过程中,是通过indexOf确定“加号”或“减号”的位置,然后截取其前面的字符串,那么,如果我们通过indexOf("-")可以获得下标位置为0,那么截取的字符串就为空字符串“”了。所以,我们要通过indexOf("-", 1)或者indexOf("+", 1)来进行判断,即:从下标为1的位置开始,而不是从下标为0的位置开始判断。具体操作如下所示:

    当我们完成了字符串方程的解析之后,我们就把x变量都放在等号左侧,将非x变量放到等号右侧。那么,在运算过程中,如果x变量在右侧的话,那么由于要被移动到左侧,所以,其正数会变为负数,而负数会变为正数。对于非x变量的移动也会遵循这一点。那么当移动完毕之后,我们会统计x的总和(xSum)以及非x数字的总和(sum)。那么当xSum等于0并且sum等于0的时候,方法返回“Infinite solutions”;否则,如果只有xSum等于0,那么则返回“No solution”;否则,返回 x= sum/xSum。具体操作如下所示:

    四、代码实现

    4.1> 实现1:

    1. class Solution {
    2.     int xSum = 0// 所有x,都移动到等号左侧进行计算
    3.     int sum = 0// 所有数字,均移动到等号右侧进行计算
    4.     
    5.     public String solveEquation(String equation) {
    6.         calculate(equation.split("=")[0], true);
    7.         calculate(equation.split("=")[1], false);
    8.         return (xSum == 0 && sum == 0) ? "Infinite solutions" : (xSum == 0 ? "No solution" : "x=" + sum/xSum);
    9.     }
    10.     public void calculate(String equation, boolean left) {
    11.         while(true) {
    12.             if (equation == null || equation.equals("")) break;
    13.             // 防止第一个数是负数,将其当做减号,所以从第一位开始对比
    14.             int minusIndex = equation.indexOf("-"1) == -1 ? Integer.MAX_VALUE : equation.indexOf("-"1); 
    15.             int plusIndex = equation.indexOf("+"1) == -1 ? Integer.MAX_VALUE : equation.indexOf("+"1);
    16.             int endIndex = (minusIndex == Integer.MAX_VALUE && plusIndex == Integer.MAX_VALUE) ? equation.length() : Math.min(minusIndex, plusIndex);
    17.             String numStr = equation.substring(0, endIndex);
    18.             if (numStr.contains("x")) {
    19.                 // 针对x或者nx的特殊处理
    20.                 int xnum = (numStr.equals("x") || numStr.equals("+x")) ? 1 : (numStr.equals("-x") ? -1Integer.valueOf(numStr.replace("x""")));
    21.                 xSum += left ? xnum : -xnum;
    22.             } else { // 减法操作
    23.                 sum += left ? -Integer.valueOf(numStr) : Integer.valueOf(numStr);
    24.             }
    25.             equation = equation.substring(endIndex);
    26.         }
    27.     }
    28. }

    今天的文章内容就这些了:

    写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

    更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

  • 相关阅读:
    [云原生k8s] k8s的CA证书创建和使用
    【2021集创赛】Arm杯二等奖-基于Arm核的智慧病房手势识别方案
    HDL-Bits 刷题记录 03
    Java 基于微信小程序的快递柜小程序
    将钉钉机器人小程序从一个公司迁移至另一个公司的步骤
    LeetCode --- 1394. Find Lucky Integer in an Array 解题报告
    校招面试数据库原理知识复习总结
    1.2、因特网概述
    mongodb之shard分片
    java毕业设计Joker视频网站mybatis+源码+调试部署+系统+数据库+lw
  • 原文地址:https://blog.csdn.net/qq_26470817/article/details/126259107