说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
求解一个给定的方程,将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'
思路分析
题目的意思很清楚,就是会给我们一个一元一次方程,我们需要求解方程,计算出其中变量x的取值。这是小学的题目,我相信基本每一位同学都可以快速的笔算或者说口算出来,但是要怎么让电脑去帮我们进行计算呢?那我们首先就要想一下自己是怎么进行计算的,然后将我们的方法告诉电脑,就可以让电脑来帮我们进行计算了。
首先让我们先来回顾一下一元二次方程的解题过程:
- 1、合并同类项,分别对变量和常量进行合并求值
- 2、移项化简求值
解题过程其实很简单,但我们要怎么将其写成代码呢?主要可以分成下面这几步:
- 1、找出等式中的数值项及运算符
let q = equation.split('='); let symbol = [[],[]]; for(let j = 0; j < 2; j++){ for(let i = 0; i < q[j].length; i++){ if(q[j][i] == '+' || q[j][i] == '-'){ symbol[j].push(q[j][i]); } } q[j] = q[j].split(/\+|\-/g); if(q[j].length > symbol[j].length) symbol[j].unshift('+'); }
- 2、合并同类项
let x,n = 0; for(let i = 0; i < q.length; i++){ for(let j = 0; j < q[i].length; j++){ if(q[i][j].includes('x')){ x = cal(x || 0,parseInt(q[i][j]) || (q[i][j][0] == '0' ? 0 : 1),symbol[i][j],i == 0); }else{ n = cal(n,q[i][j],symbol[i][j],i == 1); } } }
- 3、变量系数化简
if(x == 0 && n == 0) return "Infinite solutions"; if(!x) return "No solution"; return "x=" + n / x;
AC代码
/** * @param {string} equation * @return {string} */ var solveEquation = function(equation) { let q = equation.split('='); let symbol = [[],[]]; for(let j = 0; j < 2; j++){ for(let i = 0; i < q[j].length; i++){ if(q[j][i] == '+' || q[j][i] == '-'){ symbol[j].push(q[j][i]); } } q[j] = q[j].split(/\+|\-/g); if(q[j].length > symbol[j].length) symbol[j].unshift('+'); } const cal = (a,b,symbol,flag) => { a = parseInt(a) || 0; b = parseInt(b) || 0; switch(symbol){ case '+': return flag ? a + b : a - b; case '-': return flag ? a - b : a + b; } }; let x,n = 0; for(let i = 0; i < q.length; i++){ for(let j = 0; j < q[i].length; j++){ if(q[i][j].includes('x')){ x = cal(x || 0,parseInt(q[i][j]) || (q[i][j][0] == '0' ? 0 : 1),symbol[i][j],i == 0); }else{ n = cal(n,q[i][j],symbol[i][j],i == 1); } } } if(x == 0 && n == 0) return "Infinite solutions"; if(!x) return "No solution"; return "x=" + n / x; };
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。