Medium
题目描述
求解给定的方程并以字符串形式返回 ‘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 的形式。
核心思路:
- 将方程按 ‘=’ 分为左右两边
- 解析每一边的项,分别计算 x 的系数和常数项
- 将右边的系数和常数移到左边,得到
left_coeff * x + left_const = 0 - 根据系数判断解的情况
解析过程:
- 遍历每个字符,识别符号、数字和变量 x
- 对于 “+3x”、"-2x"、“x”、“5” 等不同形式的项进行正确解析
- 注意处理符号:方程右边的项移到左边时符号要取反
判断逻辑:
- 如果 x 系数为 0 且常数项为 0:无限解
- 如果 x 系数为 0 且常数项不为 0:无解
- 如果 x 系数不为 0:唯一解 x = -常数项/系数
实现细节: 使用状态机方式解析字符串,正确处理数字的累积和符号的变化。
代码实现
class Solution {
public:
string solveEquation(string equation) {
int pos = equation.find('=');
string left = equation.substr(0, pos);
string right = equation.substr(pos + 1);
auto parse = [](const string& s) -> pair<int, int> {
int coeff = 0, const_val = 0;
int i = 0, n = s.length();
int sign = 1;
while (i < n) {
if (s[i] == '+') {
sign = 1;
i++;
} else if (s[i] == '-') {
sign = -1;
i++;
}
if (i < n && s[i] == 'x') {
coeff += sign;
i++;
} else {
int num = 0;
while (i < n && isdigit(s[i])) {
num = num * 10 + (s[i] - '0');
i++;
}
if (i < n && s[i] == 'x') {
coeff += sign * num;
i++;
} else {
const_val += sign * num;
}
}
}
return {coeff, const_val};
};
auto [left_coeff, left_const] = parse(left);
auto [right_coeff, right_const] = parse(right);
int final_coeff = left_coeff - right_coeff;
int final_const = left_const - right_const;
if (final_coeff == 0) {
return final_const == 0 ? "Infinite solutions" : "No solution";
}
return "x=" + to_string(-final_const / final_coeff);
}
};
class Solution:
def solveEquation(self, equation: str) -> str:
def parse(s):
coeff = const = 0
i = 0
sign = 1
while i < len(s):
if s[i] == '+':
sign = 1
i += 1
elif s[i] == '-':
sign = -1
i += 1
if i < len(s) and s[i] == 'x':
coeff += sign
i += 1
else:
num = 0
while i < len(s) and s[i].isdigit():
num = num * 10 + int(s[i])
i += 1
if i < len(s) and s[i] == 'x':
coeff += sign * num
i += 1
else:
const += sign * num
return coeff, const
left, right = equation.split('=')
left_coeff, left_const = parse(left)
right_coeff, right_const = parse(right)
final_coeff = left_coeff - right_coeff
final_const = left_const - right_const
if final_coeff == 0:
return "Infinite solutions" if final_const == 0 else "No solution"
return f"x={-final_const // final_coeff}"
public class Solution {
public string SolveEquation(string equation) {
string[] parts = equation.Split('=');
string left = parts[0], right = parts[1];
(int, int) Parse(string s) {
int coeff = 0, constVal = 0;
int i = 0, sign = 1;
while (i < s.Length) {
if (s[i] == '+') {
sign = 1;
i++;
} else if (s[i] == '-') {
sign = -1;
i++;
}
if (i < s.Length && s[i] == 'x') {
coeff += sign;
i++;
} else {
int num = 0;
while (i < s.Length && char.IsDigit(s[i])) {
num = num * 10 + (s[i] - '0');
i++;
}
if (i < s.Length && s[i] == 'x') {
coeff += sign * num;
i++;
} else {
constVal += sign * num;
}
}
}
return (coeff, constVal);
}
var (leftCoeff, leftConst) = Parse(left);
var (rightCoeff, rightConst) = Parse(right);
int finalCoeff = leftCoeff - rightCoeff;
int finalConst = leftConst - rightConst;
if (finalCoeff == 0) {
return finalConst == 0 ? "Infinite solutions" : "No solution";
}
return $"x={-finalConst / finalCoeff}";
}
}
var solveEquation = function(equation) {
const [left, right] = equation.split('=');
const parse = (expr) => {
let xCoeff = 0;
let constant = 0;
let i = 0;
let sign = 1;
while (i < expr.length) {
if (expr[i] === '+') {
sign = 1;
i++;
} else if (expr[i] === '-') {
sign = -1;
i++;
}
let num = 0;
let hasNum = false;
while (i < expr.length && expr[i] >= '0' && expr[i] <= '9') {
num = num * 10 + (expr[i] - '0');
hasNum = true;
i++;
}
if (i < expr.length && expr[i] === 'x') {
if (!hasNum) num = 1;
xCoeff += sign * num;
i++;
} else {
if (hasNum) {
constant += sign * num;
}
}
}
return [xCoeff, constant];
};
const [leftX, leftConst] = parse(left);
const [rightX, rightConst] = parse(right);
const xCoeff = leftX - rightX;
const constant = rightConst - leftConst;
if (xCoeff === 0) {
return constant === 0 ? "Infinite solutions" : "No solution";
}
return `x=${constant / xCoeff}`;
};
复杂度分析
| 复杂度类型 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历整个方程字符串一次,其中 n 是方程长度 |
| 空间复杂度 | O(1) | 只使用常数个变量存储系数和常数项 |