携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
前言
今天的题目为中等,通过一个比较简单的小技巧,可以转化为简单的数学计算问题。
每日一题
今天的题目是 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"
提示:
- 3 <= equation.length <= 1000
- equation 只有一个 '='.
- equation 方程由整数组成,其绝对值在 [0, 100] 范围内,不含前导零和变量 'x' 。
题解
数学
题目存在一个很巧妙的解法,我们可以先将 '-' 替换为 '+-' 这样就可以通过 '+' 进行字符串分割,从而拿到整个方程式里面的每一个元素,拿到元素之后的解法就会变得轻松很多。
function solveEquation(equation) {
let [left, right] = equation.split('=')
let arrLeft = left.replace(/-/g,'+-').split('+')
let arrRight = right.replace(/-/g,'+-').split('+')
let xNum = 0;
console.log(arrLeft);
console.log(arrRight);
return
};
solveEquation("2x+5-3+x=6+x-2")
// [ '2x', '5', '-3', 'x' ]
// [ '6', 'x', '-2' ]
拿到数组里面的元素并且区别出左右两边之后,我们要做的就是移项,将x和正常的数字分别挪到一边,之后就是统计数字加起来的总和以及x的个数,然后就是简单的除法。
对于无解以及无限解的情况,都是在x个数为0的时候,当x个数为0,数字也为0,那就是有无限解,数字不为0,那就是无解。
function solveEquation(equation: string): string {
let [leftStr, rightStr] = equation.split('=')
let arrLeft = leftStr.replace(/-/g, '+-').split('+')
let arrRight = rightStr.replace(/-/g, '+-').split('+')
let left = 0;
let right = 0;
for (let s of arrLeft) {
if (s === "x") {
left += 1;
} else if (s === "-x") {
left += -1;
} else if (s.indexOf("x") != -1) {
left += parseInt(s.substring(0, s.length - 1));
} else if (s !== "") {
right -= parseInt(s);
}
}
for (let s of arrRight) {
if (s === "x") {
left -= 1;
} else if (s === "-x") {
left -= -1;
} else if (s.indexOf("x") != -1) {
left -= parseInt(s.substring(0, s.length - 1));
} else if (s !== "") {
right += parseInt(s);
}
}
if (left == 0) {
if (right == 0) {
return "Infinite solutions";
} else {
return "No solution";
}
} else {
return "x=" + right / left;
}
};