zoukankan      html  css  js  c++  java
  • [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)。那么对于(m * x + n = 0),我们可以马上说出(x)的可能解。考虑以下情况:
    1、(m = 0)。当(m = 0)时,(n = 0),当且仅当(n = 0)时为无限解,否则为无解。
    2、(m != 0)。那么,(x)值即为(-frac{n}{m})

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

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

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

  • 相关阅读:
    mac命令
    缓存穿透、缓存击穿、缓存雪崩区别
    计算属性 和 方法的区别
    Docker笔记
    使用excel 生成多个 sql语句
    开发分支操作步骤
    Python3.8中使用pymysql连接数据报错__init__() takes 1 positional argument but 5 were given解决方案
    测试时间评估
    js map() 函数的使用 --待补充
    左联后再内联的2种写法
  • 原文地址:https://www.cnblogs.com/hellojamest/p/11829095.html
Copyright © 2011-2022 走看看