今天我们来做一下今天的leetcode上一道中等题
题目链接在这里640. 求解方程
题意
这道题的意思比较简单,就是给了我们一个字符串方程,让我们编写一个算法来解这个方程。
初看这道题,估计会感觉很复杂(我第一次看到就是😂),因为即使我们自己去求解方程,也要费点功夫的。
但是,仔细看一下题目给定条件,可以发现这是一个一元一次的方程,而且其中只有 + -两种运算,也没有括号,这么一看好像简单点了。
接下来,我们就来分析下这道题的思路。
思路
- 首先,如果这道题让我们自己来做的话,相信我们第一步要做的就是化简方程了,也就是化简成kx + b = 0的形式。
- 然后,我们根据x的系数k和 b的大小就可以判断这个方程是否有解了。具体怎样判断呢?
- 因为最终的答案是-b/k,那么如果k==0就不能求出唯一的答案了。
- 然后,再看余下的数b,如果b==0,那么x无论取多少的数,0==0方程都成立,也就是有无限个解
- 如果b!=0,也就是 2==0这种,这个等式恒不成立,而且和x的取值无关,所以原方程无解。
- 剩下的一种情况, 就是得出化简的系数和余数,将两者求商,然后取负就可以了。
- 那么,最后的一个问题就变成了,如何求原方程的系数和余数?
- 因为方程字符串中只有数字、-、+、=、x这五种字符,我们只需要逐个进行处理即可。
- 定义一个指针i从第一位向后扫描
- 用op记录当前表达式,也就是kx 或 b,他们前面的符号情况
- 如果当前字符是+或- 将op置为1或-1,指针向后移动一位一位i++
- 如果当前字符是=,则表示等号左边的式子已经处理好了,需要移动到右边合并,所以将k和b都 乘以-1(因为移动到右边要改变符号嘛😄),将op置为初始值1,指针向后移动一位i++
- 否则,当前字符就有两种情况了,一种是一位或者多位数字的第一位,另一种是一位或多位系数的第一位
- 这时,因为数字存在多位的情况,我们额外增加一个指针j从i向后扫描,直到j指向一个运算符,也就是-+=。
- 处理完j之后,我们直到j此时指向的是下一个需要处理的运算符了,那么
i~j-1
就是表达式的内容了。然后,根据表达式最后一位j-1是否是x,可以直到当前 kx 这种,还是一个余数。如果是kx这种,也就是i~j-1是x的系数,然后将i~j-2
这段的数字字符转成数字即可,如果是数字将i~j-1
这段的数字字符转成数字即可. - 然后,将指针i指向下一个需要处理的位置,也就是j
- 最终,如果上面的步骤运行正常的话,我们就可以得出k和b的值了。
代码实现
了解了上面的思路之后,代码实现其实就非常简单了😎。
结束语
如果有更好的分析思路,欢迎大家在评论区发表看法!⛄