[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);
}
}
};