ARTS 打卡第三十周(2024.3.25~2024.3.31)

105 阅读3分钟

1. Algorithm 每周一道算法题

本周算法题为基本计算器

这道题卡了我很久,刚开始的做法是将操作数和运算符分开存放在栈中,但是这种做法有个问题解决不了,无法区分 5-(-6)和-(5-6),因为这两种情况对应的操作数栈和运算符栈都是一样的:

操作数栈:5,6

运算符栈:-,(,-

因此不能使用这种方式解决问题,那么该怎么办呢?造成上述问题的原因是在解析括号时,不能准确的知道哪些运算符和操作数是在同一个括号内的,因此转变思路,只用一个栈,同时存储操作数和运算符以及括号,这样当遇到右括号时就计算到左括号为止,并且在这种计算过程中我们需要将“-”操作符转换为操作数的符号,从而将减转换为+,不然计算的过程就会出错,比如 1+2-3+4,如果不提前处理“-”,那么就是 3+4=7,2-7=-5,1+(-5)=-4,就错了,因此当遇到“-”时,将“-”提取到操作数中,并且判断是否需要往栈中加入“+”,判断条件是“-”前面的是数字就需要添加“+”,否则不添加,这样就能解决问题

但是我们看一看上面的逻辑,非常绕,那么是否有更简单的解决办法呢?答案是有的,可以采用括号展开方法:

什么是括号展开呢?由于题目中限制了运算符只有加和减,因此我们可以将计算转换为完全从左到右的计算,计算过程中,操作数的正负怎么定呢?用栈保存,初始化为 1,表示正,遇到正就取栈中最顶层的数,遇到负则取最顶层数的负数,这样就能确定当前操作数的正负,一旦遇到"(",就将当前的运算符入栈,遇到")"则出栈,这样就能解决问题,并且能减少非常多的边界条件处理逻辑,整体清晰明了

这道题还是很有难度的,主要是第一直觉的解法是有漏洞无法解决的,然后怎么处理这个漏洞又是比较复杂的问题,因此这道题难度比较大,卡了我一周

2. Review 阅读一篇英文文章

本周未阅读英文文章

3. Techniques/Tips 分享一个技巧

Spring 中遇到循环依赖时,如果暂时无法解决,可以直接将报错的 bean 加上 @Lazy 延迟初始化解决,这种解决办法有一定的风险,可能会遇到空指针或者将循环依赖异常延迟到调用时才出现,需谨慎处理,最好的办法还是找到具体的循环,打破循环,彻底循环依赖。

4. Share 分享一个观点

本周抽空将从零开始学架构学习完了,整个课程对我帮助还是蛮大的,因为大体知道了对自己如何定位以及后续成长的方向,如果你是 java 后端开发,对未来比较迷茫,建议可以学习一下这门课程,帮助还是比较大的。

虽然这门课程已经学习完了,但是由于学习周期拉的很长,我是从年前开始学的,因此很多内容有点遗忘了,接下来准备花一周时间将以前学习课程记录的思维导图拿出来温习,巩固一下。