携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
题目描述
求解一个给定的方程,将x以字符串 "x=#value" 的形式返回。该方程仅包含 '+' , '-' 操作,变量 x 和其对应系数。
如果方程没有解,请返回 "No solution" 。如果方程有无限解,则返回 “Infinite solutions” 。
题目保证,如果方程中只有一个解,则 'x' 的值是一个整数。
示例 1:
输入: equation = "x+5-3+x=6+x-2"
输出: "x=2"
示例 2:
输入: equation = "x=x"
输出: "Infinite solutions"
示例 3:
输入: equation = "2x=x"
输出: "x=0"
提示:
- 3 <= equation.length <= 1000
- equation 只有一个 '='.
- equation 方程由整数组成,其绝对值在 [0, 100] 范围内,不含前导零和变量 'x' 。
思路
按照题目中的限制条件,这个方程是个一元一次方程,最终我们可以化解成ax + b = 0的形式。这个方程在a=0 且 b = 0的情况下有无数个解,在a=0 且 b != 0的情况下无解,其他情况下有一个解x=-b/a,因为题目保证了“如果方程中只有一个解,则 'x' 的值是一个整数”,我们可以用整数直接除。
顺着这个思路,我们的问题就变成了,如何求出a和b。我们可以把字符分成这几种情况:
- +
- '-'
- =
- nx
- n
注意,nx这个n==1的时候,是可以省略的,这时候我们要人为拼接1。
Java版本代码
class Solution {
public String solveEquation(String equation) {
int x = 0, num = 0;
boolean positive = true;
char[] chars = equation.toCharArray();
int i = 0;
while (i < chars.length) {
if (chars[i] == '+') {
positive = true;
i++;
} else if (chars[i] == '-') {
positive = false;
i++;
} else if (chars[i] == '=') {
x = -x;
num = -num;
positive = true;
i++;
} else {
int j = i;
while (j < chars.length && chars[j] != '+' && chars[j] != '-' && chars[j] != '=') {
j++;
}
if (chars[j - 1] == 'x') {
int temp = (i < j - 1 ? Integer.parseInt(equation.substring(i, j - 1)) : 1);
if (!positive) {
temp = -temp;
}
x += temp;
} else {
int temp = Integer.parseInt(equation.substring(i, j));
if (!positive) {
temp = -temp;
}
num += temp;
}
i = j;
}
}
if (x == 0) {
if (num == 0) {
return "Infinite solutions";
} else {
return "No solution";
}
} else {
return "x=" + String.valueOf(-num/x);
}
}
}