[Leetcode]640. Solve the Equation

链接:LeetCode640

求解一个给定的方程,将x以字符串"x=#value"的形式返回。该方程仅包含'+',' - '操作,变量 x 和其对应系数。
如果方程没有解,请返回“No solution”。
如果方程有无限解,则返回“Infinite solutions”。
如果方程中只有一个解,要保证返回值 x 是一个整数。

示例 1:
输入: "x+5-3+x=6+x-2"
输出: "x=2"

示例 2:
输入: "x=x"
输出: "Infinite solutions"

相关标签:Math

因为只涉及到一次项,没什么好说的,分别求解x的一次项系数以及常数即可。本题难度在于判断数值是系数以及常数,以及什么情况下会出现无解和无线解。
假设我们的x的一次项系数为m,常数为n。那么对于mx+n=0,我们可以马上说出x的可能解。考虑以下情况:
1、m=0。当m=0时,n=0,当且仅当n=0时为无限解,否则为无解。
2、m!=0。那么,x值即为nm

反推之:
无线解的情况为:m=0n=0
无解的情况为:m=0n!=0
有唯一解的情况为: m!=0

那么,接下来的难题在于判断得出的数值是系数还是常数。当出现x的时候,我们前面得出的值cur就是系数,否则为常数。有两种特殊情况需要考虑:
1、x前没有系数,即类似x+2=0时,因为遍历到x时,得到的数值cur为0,此时,我们要加的是1,而不是cur的值0
2、x前系数为0,即类似于0x=2时,因为遍历到x时,同样的,得到的数值cur0,此时,我们要加的就是系数0。为了跟其他情况进行区分,在判断cur是否为系数时,只需要判断cur是否为0以及x前系数是否为0

考虑完上面情况,我们就可以得到我们的解题思路了:
1、设置两个flag,分别代表前面的符号是+还是,以及在等号左边还是右边;设置一个cur代表遍历到该位置是数值大小。设置m,n分别代表一次项系数以及常数。
2、equation+=‘+’。方便字符串解析的收尾,也可以在for循环外,再做一次对常数项的加法。
3、循环遍历equation,得出mn。通过分析m,n的值后之后输出解。

代码如下:

python:

class Solution:
    def solveEquation(self, equation: str) -> str:
        equation += '+'
        num,flag,equation_flag = 0,1,1
        cur = 0
        n = m = 0
        for i, ch in enumerate(equation):
            if ch.isdigit():
                cur = cur * 10 + int(ch)
            elif ch == 'x':
                pre = flag * cur * equation_flag
                m += pre if (pre or equation[i-1]=='0') else equation_flag*flag
                cur  = 0
            elif ch == '+':
                n += flag * cur * equation_flag
                flag = 1
                cur = 0
            elif ch == '-':
                n += flag * cur * equation_flag
                flag = -1
                cur = 0
            elif ch == '=':
                n += flag * cur * equation_flag
                equation_flag = -1
                cur = 0
                flag = 1
        if not m and n:
            return 'No solution'
        elif not m:
            return 'Infinite solutions'
        else:
            return 'x='+str(-n//m)

C++:

class Solution {
public:
    string solveEquation(string equation) {
        int flag = 1,equation_flag = 1;
        int cur = 0,m = 0,n =0;
        equation += '+';

        for(int i=0;i<equation.size();i++){
            char ch = equation[i];
            if (ch>='0' && ch<='9'){
                cur = cur * 10 + ch - '0';
            }
            else if (ch == '+'){
                n += cur * flag * equation_flag;
                flag = 1;
                cur = 0;
            }
            else if (ch == '-')  {
                n += cur * flag * equation_flag;
                flag = -1;
                cur = 0;
            }
            else if (ch == 'x'){
                int pre = cur * flag * equation_flag;
                if (pre !=0 or (i>0 and equation[i-1]=='0')){
                   m += pre;
                }
                else {
                    m += flag * equation_flag;
                }
                cur  = 0;
            }
            else {
                n += cur * flag * equation_flag;
                cur  = 0;
                flag = 1;
                equation_flag = -1;
            }

        }
        if (n!=0 and m==0){
            return "No solution";
        }
        else if (m == 0){
            return "Infinite solutions";
        }
        else {
            return "x="+to_string(-n/m);
        }


    }
};

参考:
LeetCode 640. Solve the Equation

posted @   Jamest  阅读(319)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示