在算法题中,求解一元一次方程是一个经典的字符串处理与数学结合的问题。本文将带大家实现一个函数,能够解析仅包含 + 、 - 、变量 x 及其系数的方程,并返回指定格式的解。
问题分析
给定一个一元一次方程字符串(如 x+5-3+x=6+x-2 ),我们需要:
1. 将方程拆分为左边和右边两个部分(以 = 为界)。
2. 分别计算左右两边的 x 系数总和和常数项总和。
3. 通过移项合并得到标准形式 ax = b ,再根据 a 和 b 的值判断解的情况:
- 若 a = 0 且 b = 0 :方程有无限解。
- 若 a = 0 且 b ≠ 0 :方程无解。
- 若 a ≠ 0 :计算 x = b / a ,题目保证此时解为整数,返回 x=#value 。
核心思路:拆分与统计
处理方程的关键在于正确解析每一项的符号、系数和类型(含x/常数)。我们可以编写一个辅助函数,接收一个表达式(如 x+5-3+x ),返回该表达式的 (x系数, 常数项) 。
解析表达式的规则:
- 表达式的开头默认符号为 + (如 x+5 等价于 +x+5 )。
- 遍历表达式,逐个提取项:
- 遇到 + 或 - 时,确定当前项的符号,并开始提取项的内容。
- 项的内容若以 x 结尾:
- 项为 x 或 -x :系数为 ±1 。
- 项为 ax (a为数字):系数为 ±a 。
- 项的内容不含 x :为常数项,值为 ±数字 。
完整代码实现(Java 版)
java
public class SolveEquation {
public String solveEquation(String equation) {
String[] parts = equation.split("=");
// 解析左右两边
int[] left = parseExpression(parts[0]);
int[] right = parseExpression(parts[1]);
// 移项合并:ax = b
int a = left[0] - right[0];
int b = right[1] - left[1];
// 判断解的情况
if (a == 0) {
return b == 0 ? "Infinite solutions" : "No solution";
} else {
return "x=" + (b / a);
}
}
// 辅助函数:解析表达式,返回 [x系数, 常数项]
private int[] parseExpression(String expr) {
int coeffX = 0;
int constant = 0;
int n = expr.length();
int i = 0;
while (i < n) {
// 确定当前项的符号
char sign = '+';
if (expr.charAt(i) == '+' || expr.charAt(i) == '-') {
sign = expr.charAt(i);
i++;
}
// 提取当前项的数字部分(可能为空,如 x 对应 "")
StringBuilder numStr = new StringBuilder();
while (i < n && Character.isDigit(expr.charAt(i))) {
numStr.append(expr.charAt(i));
i++;
}
// 判断是否是含x的项
if (i < n && expr.charAt(i) == 'x') {
int num = numStr.length() == 0 ? 1 : Integer.parseInt(numStr.toString());
coeffX += sign == '+' ? num : -num;
i++; // 跳过 x
} else {
// 常数项
int num = numStr.length() == 0 ? 0 : Integer.parseInt(numStr.toString());
constant += sign == '+' ? num : -num;
}
}
return new int[]{coeffX, constant};
}
public static void main(String[] args) {
SolveEquation solution = new SolveEquation();
System.out.println(solution.solveEquation("x+5-3+x=6+x-2")); // 输出 x=2
System.out.println(solution.solveEquation("x=x")); // 输出 Infinite solutions
System.out.println(solution.solveEquation("2x+3x-6x=x+2")); // 输出 x=-1
System.out.println(solution.solveEquation("x=x+1")); // 输出 No solution
}
}
代码解释
1. split("="):将方程拆分为左右两个表达式,分别解析。
2. parseExpression 函数:核心的表达式解析逻辑,通过遍历字符区分 x 项和常数项,统计各自的总和。
3. 移项计算: a = 左边x系数 - 右边x系数 , b = 右边常数项 - 左边常数项 ,将方程转化为 ax = b 的标准形式。
4. 解的判断:根据 a 和 b 的值,返回对应的结果字符串。
测试用例验证
输入方程 输出结果 说明
x+5-3+x=6+x-2 x=2 合并后为 2x+2 = x+4 → x=2
x=x Infinite solutions 0x=0,无限解
2x+3x-6x=x+2 x=-1 合并后为 -x = x+2 → -2x=2 → x=-1
x=x+1 No solution 0x=1,无解
总结
本题的核心在于字符串的精细处理和一元一次方程的数学逻辑,通过拆分问题、编写辅助函数的方式,能够清晰地实现解题思路。该方法时间复杂度为 O(n)(n为方程长度),空间复杂度为 O(1),是高效且简洁的解法。
无论是面试还是算法练习,这类字符串与数学结合的题目都非常考验基础能力,希望本文能帮助大家掌握这类题的解题技巧。