• LeetCode中等题之求解方程


    题目

    求解一个给定的方程,将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’ 。

    来源:力扣(LeetCode)

    解题思路

      这是一个可以直接模拟的题目,但是题本身比较复杂需要注意处理给定的字符串,当然也可以直接用python自带的包来解决问题。在这一题中可以模拟人正常解方程的步骤,先将带x的元素移到一边,然后再将纯数字移到另一边,在移动的过程中需要注意正负号以及各类元素的类型问题,先将字符串同意处理成可以直接利用int转化的式子;接着将不同类型的元素分别相加;最后再约分即可获得答案。

    class Solution:
        def solveEquation(self, equation: str) -> str:
            left,right=equation.split('=') #处理字符串头部
            if left.startswith('-'):
                left='0'+left
            if right.startswith('-'):
                right='0'+right
            lo,ro=re.findall(r'\+|\-',left),re.findall(r'\+|\-',right) #分离操作符
            leftE,rightE=re.split(r'\+|\-',left),re.split(r'\+|\-',right) #分离操作数
            leftE[0]='+'+leftE[0] #统一格式
            if leftE[0]=='+x' or leftE[0]=='-x':
                leftE[0]=leftE[0][0]+'1'+'x'
            rightE[0]='+'+rightE[0]
            if rightE[0]=='+x' or rightE[0]=='-x':
                rightE[0]=rightE[0][0]+'1'+'x'
            for i in range(len(lo)): #让操作数带上自己的操作符
                leftE[i+1]=lo[i]+leftE[i+1]
                if leftE[i+1]=='+x' or leftE[i+1]=='-x':
                    leftE[i+1]=leftE[i+1][0]+'1'+'x'
            for i in range(len(ro)):
                rightE[i+1]=ro[i]+rightE[i+1]
                if rightE[i+1]=='+x' or rightE[i+1]=='-x':
                    rightE[i+1]=rightE[i+1][0]+'1'+'x'
            lx,ln,rx,rn=0,0,0,0  #分别为左边x的系数和,数字和;右边x的系数和,数字和
            for i in leftE: #计算系数
                if i.endswith('x'):
                    lx+=int(i[:-1])
                else:
                    ln+=int(i)
            for i in rightE:
                if i.endswith('x'):
                    rx+=int(i[:-1])
                else:
                    rn+=int(i)
            if lx==rx and ln!=rn:
                return "No solution"
            if lx==rx:
                return "Infinite solutions"
            if lx!=rx and ln==rn:
                return 'x=0'
            return 'x='+str((rn-ln)//(lx-rx))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

  • 相关阅读:
    mac如何创建mysql数据库
    宝塔安装脚本
    Unity WebGL 编译 报错: emcc2: error: ‘*‘ failed: [WinError 2] ϵͳ�Ҳ���ָ�����ļ���解决办法
    8.缓冲区管理器
    【嵌入式】STM32控制脉冲个数
    基于阶梯式Tent混沌和模拟退火的樽海鞘群算法
    生命 周期
    PHP redis string
    Java进阶学习各种经典书籍电子版
    python模块下载
  • 原文地址:https://blog.csdn.net/qq_18560985/article/details/126270200