リンク:LeetCode640
与えられた方程式を解く、文字列がリターンの形で「X =#値を」×。この式は、唯一の「+」が含まれている「 - 」操作、変数xとそれに対応する係数を。
方程式が解でない場合は、バック「いいえソリューション」へ進みます。
式は無限の数の解を持っている場合は、「無限の解決策」が返されます。
方程式は、xの戻り値が整数であることを保証する唯一の解決策を持っている場合。
実施例1:
入力: "X + 5-3 + X = 6 + X-2"
出力: "X = 2"
例2:
入力: "X = X"
出力: "無限のソリューション"
関連タグ:数学
一つだけのアイテム、何も言うことに関係しているので、Xに係数たら、一定の解決されます。この問題は、係数と定数値が決定されることを、より困難であり、解決策と無線ソリューションは、どのような状況下で発生しません。
我々は仮定する\(X \)は係数である(M \)\定数、(N- \)\。その後のために(N-M + X * 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 \)それ以外の場合は一定で、要因です。考慮すべき2つの特別なケースがあります
。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、、2フラグを設定することで、前のシンボルを表す\(+ \)または\( - \) 、同様に右または左に等号として、セット\(CUR \)その位置の代表は、数値にトラバースされます。設定\(M \) 、\(N- \)係数及び定数を表します。
2、式+ = '+' 。簡単な仕上げを解析する文字列が、定数項の加算を行い、外側のforループであってもよいです。
図3に示すように、式をループは、誘導された\(M \)および\(N- \) 。分析(M \)\、\(N- \)後の溶液後の出力値。
コードは以下の通りであります:
パイソン:
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);
}
}
};