640. 求解方程 : 简单模拟题

开滴滴
• 阅读 359

题目描述

这是 LeetCode 上的 640. 求解方程 ,难度为 中等

Tag : 「模拟」、「数学」、「双指针」

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

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

题目保证,如果方程中只有一个解,则 'x' 的值是一个整数。

示例 1:

输入: equation = "x+5-3+x=6+x-2"

输出: "x=2"

示例 2:

输入: equation = "x=x"

输出: "Infinite solutions"

示例 3:

输入: equation = "2x=x"

输出: "x=0"

提示:

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

模拟

为了方便,我们令 equations

由于运算符只有 +-,因此无须考虑运算优先级,可在遍历过程中进行计算。

使用变量 xnum 分别代指当前运算结果中 $x$ 的系数以及数值部分,从前往后处理 s 的每个字符,根据字符类型进行分情况讨论,假设当前处理到的数值为 $s[i]$:

  • 若 $s[i] =$ +/-:此时影响的是下一个运算数值的正负,修改对应的 op 标识;
  • 若 $s[i] =$ 数值:此时将完整的运算值进行取出(运算值可能是关于 $x$ 的描述,可能是纯数值),假设连续段 $s[i:j - 1]$ 之间为当前运算值,根据 $s[j - 1]$ 是否为字符 x 可知,是要将 $s[i:j - 2]$ 的数值累加到变量 x,还是将 $s[i:j - 1]$ 的数值累加到变量 num
  • 若 $s[i] =$ =:此时代表方程的左边已处理完,将变量 xnum 进行翻转(含义为将左边的运算结果移项到右边),并继续往后处理。

当整个字符串 s 处理完后,我们得到最终关于 $x$ 的系数 x,以及数值大小 num

根据 x 是否为 $0$ 可知答案:

  • x 为 $0$:此时根据 num 是否为 $0$ 可知是 Infinite solutions(对应 num 为 $0$) 还是 No solution(对应 num 不为 $0$)
  • x 不为 $0$:对 xnum 进行约分后,返回对应答案。

Java 代码:

class Solution {
    public String solveEquation(String s) {
        int x = 0, num = 0, n = s.length();
        char[] cs = s.toCharArray();
        for (int i = 0, op = 1; i < n; ) {
            if (cs[i] == '+') {
                op = 1; i++;
            } else if (cs[i] == '-') {
                op = -1; i++;
            } else if (cs[i] == '=') {
                x *= -1; num *= -1; op = 1; i++;
            } else {
                int j = i;
                while (j < n && cs[j] != '+' && cs[j] != '-' && cs[j] != '=') j++;
                if (cs[j - 1] == 'x') x += (i < j - 1 ? Integer.parseInt(s.substring(i, j - 1)) : 1) * op;
                else num += Integer.parseInt(s.substring(i, j)) * op;
                i = j;
            }
        }
        if (x == 0) return num == 0 ? "Infinite solutions" : "No solution";    
        else return "x=" + (num / -x);
    }
}

TypeScript 代码:

function solveEquation(s: string): string {
    let x = 0, num = 0, n = s.length
    for (let i = 0, op = 1; i < n; ) {
        if (s[i] == '+') {
            op = 1; i++;
        } else if (s[i] == '-') {
            op = -1; i++
        } else if (s[i] == '=') {
            x *= -1; num *= -1; op = 1; i++;
        } else {
            let j = i
            while (j < n && s[j] != '+' && s[j] != '-' && s[j] != '=') j++
            if (s[j - 1] == 'x') x += (i < j - 1 ? Number(s.substring(i, j - 1)) : 1) * op
            else num += Number(s.substring(i, j)) * op
            i = j
        }
    }
    if (x == 0) return num == 0 ? "Infinite solutions" : "No solution"    
    else return "x=" + (num / -x)
};
  • 时间复杂度:$O(n)$
  • 空间复杂度:使用 charAt 替换 toCharArray。复杂度为 $O(1)$

最后

这是我们「刷穿 LeetCode」系列文章的第 No.640 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSou...

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
SQL每日一题(20200810)
点击关注上方“SQL数据库开发”,设为“置顶或星标”,第一时间送达干货题目有如下一张表Person,其中ID是自增长!(https://oscimg.oschina.net/oscnet/c23185ee3ffa98e0a1789555c8c76f4adeb.png)求解,如何将相邻两条记录
Stella981 Stella981
3年前
Python实现——二次多项式回归(最小二乘法)
2019/3/25真的,当那个图像出现的时候,我真的感觉太美了。或许是一路上以来自我的摸索加深的我对于这个模型的感受吧。二次函数拟合——最小二乘法公式法与线性回归相似,对二次函数进行拟合某种意义上也只是加了一个函数,虽然求解的方程变得更加繁琐,需要准备的变量也增加到了七个。思路有借鉴于:最小二乘法拟合二次曲线C语言(https://w
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
ubuntu18.04环境下为UR3配置MoveIt!运动学插件IKFAST(二)
前言昨天已经将OpenRAVE配置好了,接下来就是配置IKFast插件了。ikfast,机器人运动学的编译器,在RosenDiankovOpenRAVE运动规划软件提供,是一个强大的逆运动学求解器。不像大多数的逆运动学求解,ikfast可以求解任意复杂运动链的运动学方程,并产生特定语言的文件(如C)后供使用。最终的结果是非常稳定的解决方
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
AI求解薛定谔方程,兼具准确度和计算效率,登上《自然
作为量子力学的基础方程之一,薛定谔方程一直广受关注。去年,DeepMind科学家开发一种新的神经网络来近似计算薛定谔方程(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Flink.zhihu.com%2F%3Ftarget%3Dhttp%253A%2F%2Fmp.weixin.q
Wesley13 Wesley13
3年前
51nod 1318 最大公约数与最小公倍数方程组(2
题意给你$n$个元素,$m$个方程。每个方程形如$$\\begin{align}\\gcd(x\_i,y\_i)c\_i\\\\mathrm{lcm}(x\_i,y\_i)d\_i\\end{align}$$之类的形式。询问这个方程组是否有解。有$T$组数据。$1\\leT\\le10,1\
流浪剑客 流浪剑客
1年前
Macos商业数学软件:MATLAB R2023a for Mac中文版激活 支持M1
是一款由MathWorks公司开发的高级计算机编程环境和开发工具,被广泛应用于科学研究、工程设计、数据分析和教育等领域。它提供了强大的数学计算功能,支持矩阵运算、数值积分、微分方程求解等,并且支持符号计算,可以进行符号代数操作和解析等运算。MATLABR2