资讯动态

LeetCode 640 求解方程

发布时间:2026/10/1 8:45:43 来源:尧图企业网站定制
LeetCode 640 求解方程 Solve the Equation难度Medium标签字符串解析、模拟、代数合并同类项题目原文题目描述求解一个给定的一元一次方程将x以字符串x#value的形式返回。该方程仅包含-操作变量x和对应的系数。三种返回情况如果方程没有解返回No solution如果方程有无穷多解返回Infinite solutions如果只有唯一解题目保证解是整数返回x数字约束方程有且仅有一个方程由整数绝对值0~100无前置零和变量x组成字符串长度范围 3 ≤ equation.length ≤1000示例示例1输入x5-3x6x-2输出x2示例2输入xx输出Infinite solutions示例3输入2xx输出x0示例4输入xx2输出No solution费曼学习法拆解本题用大白话讲给小白第一步看懂题目本质这题本质就是手写解方程合并同类项。一元一次方程通用形式a⋅xbc⋅xda\cdot x b c\cdot x da⋅xbc⋅xd移项把所有x项挪左边常数挪右边(a−c)⋅xd−b(a-c)\cdot x d-b(a−c)⋅xd−b令x_coeff a - c合并后x的总系数const d - b合并后的常数然后分3种数学场景x_coeff ! 0唯一解xconstx_coeffx\frac{const}{x\_coeff}xx_coeffconst​x_coeff 0const 00x0 → 任何x都成立无穷解x_coeff 0const !00x非0 → 无解难点不是数学是字符串解析要从字符串里拆分每一项处理坑x等价1x-x等价-1x0x100x正常系数表达式开头没有加号例如x3第二步两种解法思路对比解法1通用解析函数推荐面试首选写一个子函数parse(表达式字符串)输入一段不带的式子返回(x总系数常数总和)遍历表达式字符记录当前项符号读到数字收集数字读到x识别为x项解析完等号左边、右边合并得到(a-c)x d-b判断三种情况✅优点逻辑干净不依赖正则好理解边界好控制❌缺点需要手动遍历字符要细心处理x缺省系数x1x-x-1x解法2正则分割简洁工程写代码方便利用正则把所有项提取出来循环处理每一项✅优点代码简短❌缺点正则需要记忆面试写正则容易写错我们重点讲解法1附带完整带逐行注释Python代码。第三步踩坑清单费曼找错误坑1x不是0x是1x-x是-1x最容易错坑2区分0x系数0和x系数1坑3移项规则右边的所有项移左边符号全部翻转坑40x0无穷解0x5无解第四步现实应用场景举例在线数学计算器网页输入一元一次方程字符串自动求解很多学生数学工具底层就是这种字符串解析符号计算库SymPy这类Python符号库底层就是解析表达式、合并同类项本题是极简版本教学系统在线做题平台学生输入方程程序自动判分、自动解方程配置公式引擎低代码平台用户自定义计算公式解析字符串表达式Python代码【解法1手写遍历解析每行详细注释】classSolution:defsolveEquation(self,equation:str)-str: 主函数接收方程字符串返回求解结果 :param equation: 方程字符串中间包含一个例如x5-3x6x-2 :return: 结果字符串三选一 x#val, No solution, Infinite solutions defparse(expr:str): 子函数解析等号单侧表达式返回(x系数总和常数总和) :param expr: 不带等号的表达式如 x5-3x :return: tuple (coef_x, const_num) coef_x0# 存储所有x项的系数总和const_num0# 存储所有常数项总和nlen(expr)# 表达式字符串总长度i0# 当前遍历字符下标sign1# 当前项的符号默认正号表达式开头whilein:# 遇到加号符号置为正下标1继续ifexpr[i]:sign1i1# 遇到减号符号置为负下标1继续elifexpr[i]-:sign-1i1else:# 当前字符是数字或者x开始提取当前项ji# j向后移动直到不是数字为止截取数字部分whilejnandexpr[j].isdigit():j1# 取出i到j之间的数字字符串num_strexpr[i:j]# 如果num_str为空说明直接是x没有写系数例如x、-xnumint(num_str)ifnum_strelse1# 判断j位置是不是x代表当前项是x项ifjnandexpr[j]x:# 累加 x系数符号 * 数值coef_xsign*num j1# 跳过x字符else:# 不是x这一项是常数const_numsign*num# i跳到j处理下一项ij# 返回解析得到的x系数常数returncoef_x,const_num# 以等号分割拆成左右两段表达式left_expr,right_exprequation.split()# 分别解析左右两边left_x,left_constparse(left_expr)right_x,right_constparse(right_expr)# 移项(left_x - right_x)*x right_const - left_consttotal_x_coefleft_x-right_x total_constright_const-left_const# 判断三种情况iftotal_x_coef!0:# 唯一解x total_const / total_x_coefans_xtotal_const//total_x_coefreturnfx{ans_x}else:# x系数等于0iftotal_const0:# 0x 0无穷多解returnInfinite solutionselse:# 0x非0无解returnNo solution# 测试用例 if__name____main__:solSolution()print(sol.solveEquation(x5-3x6x-2))# x2print(sol.solveEquation(xx))# Infinite solutionsprint(sol.solveEquation(2xx))# x0print(sol.solveEquation(xx2))# No solutionprint(sol.solveEquation(-x-1))# x1解法2正则分割方案简洁版带注释importreclassSolution:defsolveEquation(self,equation:str)-str:defparse(s):coef_x0const0# 在表达式最前面补方便正则统一提取所有带符号项termsre.findall(r[-]?\d*x?,s)forterminterms:ifnotterm:continueifxinterm:# x项tterm[:-1]iftort:coef_x1elift-:coef_x-1else:coef_xint(t)else:#常数项constint(term)returncoef_x,const left,rightequation.split()lx,lcparse(left)rx,rcparse(right)cxlx-rx cnrc-lcifcx!0:returnfx{cn//cx}else:returnInfinite solutionsifcn0elseNo solution#测试if__name____main__:objSolution()print(obj.solveEquation(x5-3x6x-2))复杂度分析时间复杂度O(N)N是方程字符串长度每个字符遍历一次空间复杂度O(1)只用固定数量变量保存系数不计输入输出存储费曼复盘总结这道题核心考点字符串词法解析 合并同类项。数学逻辑很简单难点全在处理字符串的特殊情况x省略系数1、-x省略系数-1。面试推荐手写遍历版本正则版本虽然简短但面试官更想看你手动解析字符串的能力。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑