求解方程

85 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是处于什么原因,算法学习需要持续保持,今天让我们一起来看看这一道题目————求解方程

题目描述

求解一个给定的方程,将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,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。