トピック
指定された方程式を解き、x を文字列 "x=#value" として返します。方程式には、「+」、「-」演算、変数 x、およびそれに対応する係数のみが含まれます。
方程式に解がない場合は、「解がありません」を返します。方程式に無限解がある場合、「無限解」を返します。
タイトルは、方程式の解が 1 つしかない場合、「x」の値が整数であることを保証しています。
例 1:
入力: 方程式 = "x+5-3+x=6+x-2"
出力: "x=2"
例 2:
入力: 方程式 = “x=x”
出力: “無限解”
例 3:
入力: 方程式 = "2x=x"
出力: "x=0"
ヒント:
3 <= 式.長さ <= 1000
式には '=' が 1 つだけあります.
式は [0, 100] の範囲内の絶対値を持つ整数で構成され、先行ゼロと変数 'x' はありません.
答え
1つずつトラバース処理
.等号の右辺は左へ移動とみなすことができる.つまり+は-に,-は+に変わる.xの
係数の処理にも注意する.
class Solution {
public:
string solveEquation(string equation) {
int x = 0;//x系数
int sign = 1;//符号
int sum = 0;//常数和
int len = equation.length();
int leftOrright = 1;//等式左or右
for(int i=0;i<len;i++)
{
if(equation[i] == '+')
{
sign = 1;
}
else if(equation[i] == '-')
{
sign = -1;
}
else if(equation[i] == '=')
{
sign = 1;
leftOrright = -1;
}
else
{
int num = 0;
bool flag = false;//标志是否遇到了整数,没遇到的话就代表只遇到了x,这时要单独处理
//获取遇到的整数值
while(i<len && isdigit(equation[i]))
{
num = num*10+equation[i++]-'0';
flag = true;
}
num = num*sign*leftOrright;//加符号
if(equation[i]=='x')
{
if(flag)
x += num;
else
x += 1*sign*leftOrright;
}
else
{
sum += num;
i--;
}
}
}
if(x!=0)
return "x="+to_string(-sum/x);
else
return sum==0 ? "Infinite solutions" : "No solution";
}
};