力扣:640. 求解方程

167 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

640. 求解方程

求解一个给定的方程,将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 只有一个 '='. 
  • 方程由绝对值在 [0, 100]  范围内且无任何前导零的整数和变量 'x' 组成。

问题解析

写这题时可以回想一下我们解方程的时候用的方法。

我们都是先把未知数x移动到等号的左边,再把自然数移动到等号的右边,然后用自然数除去x的系数,得到的就是x的结果了。

想到了这一点后,这题就是一个简单的模拟题了。我们可以用一个变量x来表示未知数的系数,一个变量num表示自然数的大小。

因为我们此时是把未知数聚集在左边,自然数聚集在右边,所以当我们遍历的字符处于等号的左边时:

  1. 当前字符是未知数及其系数:如果系数是正数,我们把这个未知数的系数加到我们的变量x上,反之减去。
  2. 当前字符是自然数:如果自然数是正数,我们把这个自然数减去我们的变量num,反之加上。

当我们遍历到等号的右边时,操作反转:

  1. 当前字符是未知数及其系数:如果系数是负数,我们把这个未知数的系数加到我们的变量x上,反之减去。
  2. 当前字符是自然数:如果自然数是负数,我们把这个自然数减去我们的变量num,反之加上。

然后根据变量x和num的大小来判断三种结果:

  • 两者都为0时,说明x可能有无限种可能,返回"Infinite solutions"
  • x为0但num不为0时,或者num不能被x整除时,返回"No solution"
  • num能被x整除时,返回num/x

AC代码

class Solution {
public:
    string solveEquation(string equation) {
        int x = 0, num = 0, n = equation.size(), st = -1;
        for (int i = 0; i < n; i++)
        {
            if (equation[i] == 'x')
            {
                if (i == 0 || equation[i - 1] == '+' || equation[i - 1] == '=')x -= st;
                else x += st;
            }
            else if (equation[i] >= '0' && equation[i] <= '9')
            {
                bool flag = false;
                if (i == 0 || equation[i-1] == '+' || equation[i-1] == '=')flag = true;
                int y = 0;
                while (i < n && equation[i] >= '0' && equation[i] <= '9')
                {
                    y *= 10;
                    y += equation[i++] - '0';
                }
                i--;
                if (flag)
                {
                    if (i + 1 < n && equation[i + 1] == 'x')x -= y * st, i++;
                    else num += y * st;
                }
                else
                {
                    if (i + 1 < n && equation[i + 1] == 'x')x += y * st, i++;
                    else num -= y * st;
                }
            }
            else if (equation[i] == '=')st *= -1;
        }
        if (x == 0 && num == 0)return "Infinite solutions";
        else if (x == 0 || num % x != 0)return "No solution";
        string s = "x=" + to_string(num / x);
        return s;
    }
};