题目来源:https://leetcode.cn/problems/solve-the-equation/
题意:
求解一个给定的方程,将x以字符串 “x=#value” 的形式返回。该方程仅包含 ‘+’ , ‘-’ 操作,变量 x 和其对应系数。
如果方程没有解,请返回 “No solution” 。如果方程有无限解,则返回 “Infinite solutions” 。
题目保证,如果方程中只有一个解,则 ‘x’ 的值是一个整数。
思路
将给定字符串按照“=”分割后,获得方程两侧的表达式内容,分别处理两侧的表达式,统计出两侧各自出现的
x 的系数和常数值,然后进行判断:
- 两侧 x 的系数相同,若常数也相同,则表示方程有无限解,返回 “Infinite solutions” ;否则,表示方程无解,返回 “No solution”
- 两侧 x 的系数不同,则进行交换操作,将左侧表达式 x 的系数减去右侧 x 的系数,右侧常数值减去左侧常数值,然后将常数值的差除以系数的差即为结果
具体实现时,可以设计一个方法统计表达式中 x 的系数和常数值
代码:
public class SolveEquation {
public String solveEquation(String equation) {
String[] strs = equation.split("=");
int m = 0;
int var1 = 0;
int n = 0;
int var2 = 0;
// 获取方程两侧表达式中 x 的系数和常数值
int[] res = getVar(strs[0]);
m = res[0];
var1 = res[1];
res = getVar(strs[1]);
n = res[0];
var2 = res[1];
// 若 x 的系数相同
if (m == n) {
// 常数不同
if (var1 != var2) {
return "No solution";
} else { // 常数相同
return "Infinite solutions";
}
}
// 计算并返回结果
int ans = (var2 - var1) / (m - n);
return "x=" + ans;
}
/**
* 统计给定表达式中 x 的系数和常数值
*
* @param expr
* @return
*/
public int[] getVar(String expr) {
// x 的系数
int xCount = 0;
// 常数
int var = 0;
int n = expr.length();
// 遍历下标
int i = 0;
while (i < n) {
// 标记当前遍历数字是否为复数
boolean isNeg = false;
// 标记当前遍历数字是否属于常数,也就是数字后是否跟了一个 x
boolean isNum = false;
// 开头为 -,表示负数
if (expr.charAt(i) == '-') {
isNeg = true;
i++;
} else if (expr.charAt(i) == '+') {
i++;
}
// 取出当前遍历的数字
int cur = 0;
while (i < n && Character.isDigit(expr.charAt(i))) {
isNum = true;
cur = cur * 10 + expr.charAt(i) - '0';
i++;
}
// 若是负数,将其处理为负数
if (isNeg) {
cur = -cur;
}
// 若数字后跟了一个 x,则更新 x 的系数
if (i < n && expr.charAt(i) == 'x') {
// 数字没出现,只出现 -x 的情况
if (!isNum) {
cur = isNeg ? -1 : 1;
}
// 更新系数
xCount += cur;
// 更新索引
i++;
} else {
// 更新常数
var += cur;
}
}
return new int[]{xCount, var};
}
}