640. 求解方程
日期:2022/8/10
题目描述:求解一个给定的方程,将x以字符串 “x=#value” 的形式返回。该方程仅包含 ‘+’ , ‘-’ 操作,变量 x 和其对应系数。
如果方程没有解,请返回 “No solution” 。如果方程有无限解,则返回 “Infinite solutions” 。
题目保证,如果方程中只有一个解,则 ‘x’ 的值是一个整数。
示例:
输入: equation = "x+5-3+x=6+x-2"
输出: "x=2"
输入: equation = "x=x"
输出: "Infinite solutions"
输入: equation = "2x=x"
输出: "x=0"
思路:
移项,定义k=0,b=0,kx=b(最后return b/k)
遍历equation,有下面四种情况
1.遇到=,从等式左边变到等式右边。用right来记录。等式两边的符号运算时是相反的
2.遇到数字,这时候有两种可能:后面带x、后面不带x。先while循环记录这个数字,再根据后面有没有x,来改变k或者b
3.遇到x,此时x的系数是1或-1
4.遇到符号,用symbol来记录当前符号,以便在后续的步骤2或3中计算
最后输出:k=0时肯定是无效的,但是b=0的话就是"Infinite solution",b!=0的话是"No solution"
k!=0时输出"x=" + to_string(b/k);
代码+解析:
class Solution {
public:
string solveEquation(string equation) {
int k=0,b=0; //kx=b; return b/k
bool right = false ; //是否碰到=,初始是没碰到
int symbol=1; //1代表+,2代表-
for(int i=0; i<equation.size(); i++){
if(equation[i] == '='){
symbol = 1; //默认为+
right = true;
}
else if(equation[i] >='0' && equation[i] <='9'){
//数字,可能是系数也可能是b
int temp = 0;
while(i<equation.size() && equation[i] >= '0' && equation[i] <= '9'){
temp = temp*10 + equation[i] - '0';
i++;
}
if(equation[i] == 'x'){ //是系数
if((!right && symbol == 1) || (right && symbol == 2)) k += temp;
else k -= temp;
}else{ //不是系数
if((!right && symbol == 2) || (right && symbol == 1)) b += temp;
else b -= temp;
i--;
}
}else if(equation[i] == 'x'){
//系数为1或-1的x
if((!right && symbol == 1) || (right && symbol == 2)) k += 1;
else k -= 1;
}else{
//符号
if(equation[i] == '+') symbol = 1;
else symbol = 2;
}
}
if(k == 0) return b == 0 ? "Infinite solutions" : "No solution";
else return "x=" + to_string(b/k);
}
};
学到的总结:
- 思路不难,但是分类讨论时要很细节,要想到很多
- 第一次有些细节没想到,后来重新又从头开始写才把测试用例可以通过。结果提交时有一半没通过,急死了,检查了才发现是equation[i]转换为int时没有加-‘0’,还好不是什么细节没有注意到,可喜可贺!
执行结果:
通过
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6 MB, 在所有 C++ 提交中击败了31.17%的用户
通过测试用例:59 / 59