携手创作,共同成长!这是我参与「掘金日新计划 · 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表示自然数的大小。
因为我们此时是把未知数聚集在左边,自然数聚集在右边,所以当我们遍历的字符处于等号的左边时:
- 当前字符是未知数及其系数:如果系数是正数,我们把这个未知数的系数加到我们的变量x上,反之减去。
- 当前字符是自然数:如果自然数是正数,我们把这个自然数减去我们的变量num,反之加上。
当我们遍历到等号的右边时,操作反转:
- 当前字符是未知数及其系数:如果系数是负数,我们把这个未知数的系数加到我们的变量x上,反之减去。
- 当前字符是自然数:如果自然数是负数,我们把这个自然数减去我们的变量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;
}
};