当前位置:网站首页>640. 求解方程 : 简单模拟题
640. 求解方程 : 简单模拟题
2022-08-10 14:31:00 【宫水三叶的刷题日记】
题目描述
这是 LeetCode 上的 640. 求解方程 ,难度为 中等。
Tag : 「模拟」、「数学」、「双指针」
求解一个给定的方程,将 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"
提示:
equation
只有一个'='
.equation
方程由整数组成,其绝对值在 范围内,不含前导零和变量'x'
。
模拟
为了方便,我们令 equation
为 s
。
由于运算符只有 +
和 -
,因此无须考虑运算优先级,可在遍历过程中进行计算。
使用变量 x
和 num
分别代指当前运算结果中 的系数以及数值部分,从前往后处理 s
的每个字符,根据字符类型进行分情况讨论,假设当前处理到的数值为 :
若 +/-
:此时影响的是下一个运算数值的正负,修改对应的op
标识;若 数值
:此时将完整的运算值进行取出(运算值可能是关于 的描述,可能是纯数值),假设连续段 之间为当前运算值,根据 是否为字符x
可知,是要将 的数值累加到变量x
,还是将 的数值累加到变量num
;若 =
:此时代表方程的左边已处理完,将变量x
和num
进行翻转(含义为将左边的运算结果移项到右边),并继续往后处理。
当整个字符串 s
处理完后,我们得到最终关于 的系数 x
,以及数值大小 num
。
根据 x
是否为 可知答案:
若 x
为 :此时根据num
是否为 可知是Infinite solutions
(对应num
为 ) 还是No solution
(对应num
不为 )若 x
不为 :对x
和num
进行约分后,返回对应答案。
Java 代码:
class Solution {
public String solveEquation(String s) {
int x = 0, num = 0, n = s.length();
char[] cs = s.toCharArray();
for (int i = 0, op = 1; i < n; ) {
if (cs[i] == '+') {
op = 1; i++;
} else if (cs[i] == '-') {
op = -1; i++;
} else if (cs[i] == '=') {
x *= -1; num *= -1; op = 1; i++;
} else {
int j = i;
while (j < n && cs[j] != '+' && cs[j] != '-' && cs[j] != '=') j++;
if (cs[j - 1] == 'x') x += (i < j - 1 ? Integer.parseInt(s.substring(i, j - 1)) : 1) * op;
else num += Integer.parseInt(s.substring(i, j)) * op;
i = j;
}
}
if (x == 0) return num == 0 ? "Infinite solutions" : "No solution";
else return "x=" + (num / -x);
}
}
TypeScript 代码:
function solveEquation(s: string): string {
let x = 0, num = 0, n = s.length
for (let i = 0, op = 1; i < n; ) {
if (s[i] == '+') {
op = 1; i++;
} else if (s[i] == '-') {
op = -1; i++
} else if (s[i] == '=') {
x *= -1; num *= -1; op = 1; i++;
} else {
let j = i
while (j < n && s[j] != '+' && s[j] != '-' && s[j] != '=') j++
if (s[j - 1] == 'x') x += (i < j - 1 ? Number(s.substring(i, j - 1)) : 1) * op
else num += Number(s.substring(i, j)) * op
i = j
}
}
if (x == 0) return num == 0 ? "Infinite solutions" : "No solution"
else return "x=" + (num / -x)
};
时间复杂度: 空间复杂度:使用 charAt
替换toCharArray
。复杂度为
最后
这是我们「刷穿 LeetCode」系列文章的第 No.640
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地
边栏推荐
- usb转rs485测试软件,usb转rs485「建议收藏」
- file system design
- 蓝帽杯半决赛火炬木wp
- Using data intelligence, Amazon cloud technology helps companies build endogenous brand growth
- BFT机器人带你走进智慧生活 ——探索遨博机器人i系列的多种应用
- 使用mysq语句操作数据库
- NAACL 2022 | 简单且高效!随机中间层映射指导的知识蒸馏方法
- How to code like a pro in 2022 and avoid If-Else
- 王学岗—————————哔哩哔哩直播-手写哔哩哔哩硬编码录屏推流(硬编)(26节课)
- [JS Advanced] Creating sub-objects and replacing this_10 in ES5 standard specification
猜你喜欢
随机推荐
基于ArcGIS水文分析、HEC-RAS模拟技术在洪水危险性及风险评估
高薪程序员&面试题精讲系列135之你对分布式是怎么理解的?CAP理论你知道吗?
sql语句 异常 Err] 1064 – You have an error in your SQL syntax; check the manual that corresponds to your
借数据智能,亚马逊云科技助力企业打造品牌内生增长力
基于inotify实现落盘文件的跨进程实时读写交互
Pointer (preliminary solution of C language)
1W word detailed thread local storage ThreadLocal
PHP 判断文件是否有内容,没有内容则复制另一个文件写入
【Gazebo入门教程】第三讲 SDF文件的静/动态编程建模
领域驱动模型设计与微服务架构落地-从项目去剖析领域驱动
FPN详解
Lithium battery technology
锂电池技术
vue 怎么清除tab 切换缓存问题 ?
系统架构系列文章三--解决传统企业核心系统的性能问题
司空见惯 - 股市狠狠下跌后,何時能反弹?
【MindSpore易点通机器人-02】设计与技术选型
易观分析联合中小银行联盟发布海南数字经济指数,敬请期待!
leetcode 739. Daily Temperatures Daily Temperatures (Moderate)
@RequestBody的使用[通俗易懂]