题目地址:
https://leetcode.com/problems/solve-the-equation/
给定一个字符串形式给出的一元一次方程,要求返回其解,如果有唯一解,则返回"x=#"
的形式的字符串;若无穷个解则返回"Infinite solutions"
;若无解则返回"No solution"
。
先将方程按照=
做split,然后解析左右两边的x
的系数和常数项,最后分类讨论即可。解析的方式是用双指针。对于一个表达式,先将其前面加一个正号(如果以负号开头则不用加),然后维持慢指针永远都是指向正负号,快指针用来解析正负号后面的常数。具体代码如下:
public class Solution {
public String solveEquation(String equation) {
String[] split = equation.split("=");
int[] left = coeff(split[0]), right = coeff(split[1]);
int[] coeff = {left[0] - right[0], left[1] - right[1]};
if (coeff[0] == 0) {
return coeff[1] == 0 ? "Infinite solutions" : "No solution";
} else {
return "x=" + (-coeff[1] / coeff[0]);
}
}
private int[] coeff(String s) {
// 如果s不以负号开头,则前面加上一个正号
if (s.charAt(0) != '-') {
s = "+" + s;
}
int[] res = new int[2];
// coefX表示x的系数,coefC表示常数项
int coefX = 0, coefC = 0;
// l表示慢指针,r表示快指针
int l = 0, r = 0;
while (l < s.length()) {
// 取出正负号
char ch = s.charAt(l);
// r从l后面一位开始向后走
r = l + 1;
// 略过数字
while (r < s.length() && Character.isDigit(s.charAt(r))) {
r++;
}
int coef = 0;
// 如果r停在了l后面一位,说明s[r] = 'x',将x的系数加上或者减去1
if (r == l + 1) {
coefX += ch == '+' ? 1 : -1;
} else {
// 否则解析出数字
int cof = Integer.parseInt(s.substring(l + 1, r));
coef = ch == '+' ? cof : -cof;
// 如果r走到了末尾或者r走到了正负号,则说明要更新常数项;否则要更新x的系数
if (r == s.length() || s.charAt(r) != 'x') {
coefC += coef;
} else {
coefX += coef;
}
}
// 如果r走到末尾了就退出循环
if (r == s.length()) {
break;
}
// 否则将l移到下一个正负号上
l = s.charAt(r) == 'x' ? r + 1 : r;
}
return new int[]{coefX, coefC};
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。