解题思路:
1.将等号左边和右边区分开来计算。
2.定义leftnum , leftx,计算 等号左边的数字的和 和 x系数的和,定义rightnum, rightx,计算等号右边的数字的和 和 x系数的和。(数字 和 x的系数 不止一位数)
3.分别将数字的和 移动到一边,x的系数和移动到另一边,对于不同的情况进行判断,输出结果。
class Solution {
public:
void _sol(string& equation, int begin, int end, int& num, int& x)
{
int flag = 0; //标志符号位, -1 代表负数, 0 代表刚开始没有符号 ,1代表正数
int i = 0;
for (int i = begin; i < end; ++i) //处理等号左边和右边
{
if (equation[i] == '+')
{
flag = 1;
}
else if (equation[i] == '-')
{
flag = -1;
}
else if (equation[i] == 'x')//x前面没有系数
{
if (flag == -1)
{
x--;
}
else
{
x++;
}
}
else //数字 - 数字可能不止一位数
{
int _num = 0;
while (i < equation.size() && equation[i] >= 48 && equation[i] <= 57)//最后一个是数字
{
_num *= 10;
_num += equation[i] - '0';
++i;
}
if (i < equation.size() && equation[i] == 'x')//如果数字后面是x,说明这个数字是x的系数
{
if (flag >= 0) //符号位0,1都代表正数
{
x += _num;
}
else
{
x -= _num;
}
}
else
{
if (flag >= 0) //数字后面一位不是x就是正常的数字
{
num += _num;
}
else
{
num -= _num;
}
--i; //多走了一位,为了判断是否为x,这里要减去
}
}
}
}
string solveEquation(string equation)
{
int leftnum = 0, leftx = 0; //等号左边
int rightnum = 0, rightx = 0; //等号右边
int begin = 0;
int end = equation.size();
int mid = 0;
for (int i = 0; i < equation.size(); ++i)
{
if (equation[i] == '=') //找到=,区分左右边界
{
mid = i;
break;
}
}
_sol(equation, begin, mid, leftnum, leftx);
_sol(equation, mid + 1, end, rightnum, rightx);
int num = leftnum - rightnum; //把右边的数字移到左边
int x = rightx - leftx; //把左边的x移到右边
if (num == 0 && x == 0)
{
return "Infinite solutions";
}
else if (num != 0 && x == 0)
{
return "No solution";
}
else
{
return "x=" + to_string(num / x);
}
}
};