青训营X豆包MarsCode 技术训练营AI刷题实践记录以及工具使用| 豆包MarsCode AI 刷题

51 阅读4分钟

在刷题时遇到了这样的一道题:实现一个基本的计算器来计算简单的字符串表达式的值。该字符串表达式有效,并可能包含数字(0-9)、运算符+-及括号()。注意,字符串中不包含空格。除法运算应只保留整数结果。请实现一个解析器计算这些表达式的值,且不使用任何内置的eval函数。

作为一个初学者来说,在遇到这种问题时,还是有些发怵,有些不知所措的,我不知道该选择什么样的数据结构去解决这种问题,而MarsCode恰好可以充当一个指导者的角色,我直接问Mars Code给我一些关于如何解决这道问题的思路提示,那MarsCode也是给出了这道题的一些基本的信息以及思路,简单的字符串的四则运算应该用到栈,MarsCode告诉我这道题可以使用两个栈来解决一个用于存储符号,另外一个用于存储数字,然后进行遍历字符串,将数字和符号分别放入两个栈中,在次过程中,如果遇到数字,则直接存入数字栈中,如果遇到左括号,则直接存入符号栈中,如果遇到右括号,则符号栈中左括号上面的符号依次出栈并且在数字栈中找到每个符号所对应的左右操作数进行运算,运算完后的结果入到数字栈内,直到符号栈中遇到左括号为止,最后将左括号出栈。如果遇到其他符号,那么就看符号的优先级,‘+’ 、 ‘-’的优先级相同并且低于‘*’ 、 ‘/’(优先级同样是相同的)(这里只考虑简单的四则运算,如果有其他符号例如'^'那么将它的优先级定为最高即可),MarsCode告诉我可以使用一个Map来存储符号和优先级,符号作为键存入,而优先级(数字表示)作为值存入,在遇到其他符号的时候,符号栈不为空且栈内栈顶元素的优先级高于或者等于要存入的符号,那么栈顶符号出栈,找出栈顶元素符号的对应的两个操作数,进行计算,计算完之后的结果再存入数字栈中。最后处理剩余的运算符。

上述就是MarsCode给出的整体思路还是非常清晰的,我也是按照MarsCode给出的思路去进行了代码实现,在这之中遇到了一些问题,例如### 1. 解析多位数字

在遍历表达式时,如果遇到数字字符,需要继续向后遍历直到遇到非数字字符,然后将完整的数字压入 numStack。 我忽略了如果有两位数该怎么办,MarsCode也是帮我检查了代码之后给出了提示,这样少了很多Debug的找bug浪费的时间。

然后又在### 2.处理运算符时,优先级表中没有定义的运算符导致了 null 值。我们需要确保所有可能的运算符都在优先级表中定义。在与符号栈内元素进行比较优先级时,可能会遇到左括号,而我们只考虑加减乘除四个符号,遇到左括号右括号就直接把括号里的内容计算了,这样就不需要定义括号的优先级了,而在左括号进栈之后,如果下一个符号是一个加号,那么进栈时就会与左括号进行比较优先级,而左括号不在Map内,所以就会报错,MarsCode对此也给了解决方法,就是在比较优先级时多加一个限制条件,如果栈顶元素不是左括号才能进行比较。

这些都是写代码时遇到的一些细节问题,而自己去找的话就要浪费很多时间,并且可能不知道如何去解决,可能代码思路都要重写,而MarsCode可以在很短时间内找到问题所在,并且给出比较好的解决方法,这也提高了刷题的效率。 总的来说,MarsCode还是对于编程非常有帮助的,在算法改错方面是非常好的一个辅助工具,能帮我们节省很多时间并且学习很多新思路。