代码求解方程
2023-12-15 23:32:09
说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
求解一个给定的方程,将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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。
文章来源:https://blog.csdn.net/Twinkle_sone/article/details/135026734
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!