主战场在知乎,目前该问题有极高的关注热度。
据 Richard Xu 本人最新回应的进展是:尚未得到阿里巴巴组委会的回应。
目前还不知道事情会往哪个方向发展,大家觉得阿里会对请示信作出什么回应?
...
回归主线。
来一道稍稍麻烦的模拟题。
平台:LeetCode
题号:640
求解一个给定的方程,将 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"
提示:
equation
只有一个 '='
.equation
方程由整数组成,其绝对值在 范围内,不含前导零和变量 'x'
。
为了方便,我们令 equation
为 s
。
由于运算符只有 +
和 -
,因此无须考虑运算优先级,可在遍历过程中进行计算。
使用变量 x
和 num
分别代指当前运算结果中 x
的系数以及数值部分,从前往后处理 s
的每个字符,根据字符类型进行分情况讨论,假设当前处理到的数值为
:
+/-
:此时影响的是下一个运算数值的正负,修改对应的 op
标识;
数值
:此时将完整的运算值进行取出(运算值可能是关于
的描述,可能是纯数值),假设连续段
之间为当前运算值,根据
是否为字符 x
可知,是要将
的数值累加到变量 x
,还是将
的数值累加到变量 num
;
=
:此时代表方程的左边已处理完,将变量 x
和 num
进行翻转(含义为将左边的运算结果移项到右边),并继续往后处理。
当整个字符串 s
处理完后,我们得到最终关于 x
的系数 x
,以及数值大小 num
。
根据 x
是否为 0 可知答案:
x
为 :此时根据 num
是否为
可知是 Infinite solutions
(对应 num
为
) 还是 No solution
(对应 num
不为
)
x
不为 :对 x
和 num
进行约分后,返回对应答案。
Java 代码:
class Solution {
public String solveEquation(String s) {
int x = 0, num = 0, n = s.length();
char[] cs = s.toCharArray();
for (int i = 0, op = 1; i < n; ) {
if (cs[i] == '+') {
op = 1; i++;
} else if (cs[i] == '-') {
op = -1; i++;
} else if (cs[i] == '=') {
x *= -1; num *= -1; op = 1; i++;
} else {
int j = i;
while (j < n && cs[j] != '+' && cs[j] != '-' && cs[j] != '=') j++;
if (cs[j - 1] == 'x') x += (i < j - 1 ? Integer.parseInt(s.substring(i, j - 1)) : 1) * op;
else num += Integer.parseInt(s.substring(i, j)) * op;
i = j;
}
}
if (x == 0) return num == 0 ? "Infinite solutions" : "No solution";
else return "x=" + (num / -x);
}
}
C++ 代码:
class Solution {
public:
string solveEquation(string s) {
int x = 0, num = 0, n = s.length();
for (int i = 0, op = 1; i < n; ) {
if (s[i] == '+') {
op = 1; i++;
} else if (s[i] == '-') {
op = -1; i++;
} else if (s[i] == '=') {
x *= -1; num *= -1; op = 1; i++;
} else {
int j = i;
while (j < n && s[j] != '+' && s[j] != '-' && s[j] != '=') j++;
if (s[j - 1] == 'x') x += (i < j - 1 ? stoi(s.substr(i, j - i - 1)) : 1) * op;
else num += stoi(s.substr(i, j)) * op;
i = j;
}
}
if (x == 0) return num == 0 ? "Infinite solutions" : "No solution";
else return "x=" + to_string(-num / x);
}
};
Python 代码:
class Solution:
def solveEquation(self, s: str) -> str:
x, num, n = 0, 0, len(s)
i, op = 0, 1
while i < n:
if s[i] == '+':
op, i = 1, i + 1
elif s[i] == '-':
op, i = -1, i + 1
elif s[i] == '=':
x, num, op, i = x * -1, num * -1, 1, i + 1
else:
j = i
while j < n and s[j] not in '+-=':
j += 1
if s[j - 1] == 'x':
x += (int(s[i:j - 1]) if i < j - 1 else 1) * op
else:
num += int(s[i:j]) * op
i = j
if x == 0:
return "Infinite solutions" if num == 0 else "No solution"
else:
return f"x={num // -x}"
TypeScript 代码:
function solveEquation(s: string): string {
let x = 0, num = 0, n = s.length
for (let i = 0, op = 1; i < n; ) {
if (s[i] == '+') {
op = 1; i++;
} else if (s[i] == '-') {
op = -1; i++
} else if (s[i] == '=') {
x *= -1; num *= -1; op = 1; i++;
} else {
let j = i
while (j < n && s[j] != '+' && s[j] != '-' && s[j] != '=') j++
if (s[j - 1] == 'x') x += (i < j - 1 ? Number(s.substring(i, j - 1)) : 1) * op
else num += Number(s.substring(i, j)) * op
i = j
}
}
if (x == 0) return num == 0 ? "Infinite solutions" : "No solution"
else return "x=" + (num / -x)
};
charAt
替换 toCharArray
。复杂度为