代码求解方程

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

求解一个给定的方程,将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、找出等式中的数值项运算符
javascript 复制代码
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、合并同类项
javascript 复制代码
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、变量系数化简
javascript 复制代码
if(x == 0 && n == 0) return "Infinite solutions";
if(!x) return "No solution";
return "x=" + n / x;

AC代码

javascript 复制代码
/**
 * @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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

相关推荐
meilindehuzi_a8 小时前
从零理解并实现 RAG:用 LangChain.js 构建语义检索问答系统
开发语言·javascript·langchain
:-)10 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
鱼樱前端10 小时前
别再自己拼凑了!这款 Vue 3.5+ 严肃产品级组件库,把 AI 对话、工作流和复杂数据全包了!
javascript·vue.js·github
Listen·Rain10 小时前
Vue3:setup详解
前端·javascript·vue.js
kyriewen11 小时前
面试官让我优化一个卡死的表格,我打开 Claude 五秒重写,他放下咖啡问我要不要来当组长
前端·javascript·面试
小粉粉hhh12 小时前
React(二)——dom、组件间通信、useEffect
前端·javascript·react.js
Jerry14 小时前
LeetCode 101. 对称二叉树
算法
索西引擎14 小时前
【React】key 属性:协调算法中的元素标识机制与最佳实践
前端·javascript·react.js
可编程芯片开发15 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星15 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学