代码求解方程

说在前面

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

题目描述

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

相关推荐
茉莉玫瑰花茶22 分钟前
C++ 17 详细特性解析(5)
开发语言·c++·算法
Mr Xu_28 分钟前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
cpp_250135 分钟前
P10570 [JRKSJ R8] 网球
数据结构·c++·算法·题解
cpp_250141 分钟前
P8377 [PFOI Round1] 暴龙的火锅
数据结构·c++·算法·题解·洛谷
子兮曰43 分钟前
深入理解滑块验证码:那些你不知道的防破解机制
前端·javascript·canvas
Highcharts.js1 小时前
【Highcharts】如何用命令行渲染导出图片?
javascript·导出·开发文档·highcharts·命令行渲染·命令行功能
uesowys1 小时前
Apache Spark算法开发指导-Factorization machines classifier
人工智能·算法
季明洵1 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi1 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
I_LPL1 小时前
day26 代码随想录算法训练营 回溯专题5
算法·回溯·hot100·求职面试·n皇后·解数独